7
def size(number):
    if number<100:
        return Small()

    if number<1000:
        return Medium()

    return Big()

def size1(number):
    if number<100:
        return Small()
    elif number<1000:
        return Medium()
    else:
        return Big()

コーディング スタイルについて: 次のブロックまたは最後のブロックが大きなコードの塊である場合は、前者をよく使用します。可読性に役立ちそうです。

私は通常、さまざまなブロックに共通の概念がある場合に後者を使用します (上記の場合のように)。共通のインデントは、それらの関係を伝えるのに役立ちます。

注目に値するこれら2つの違いはありますか(特にパフォーマンスに関して)?

4

2 に答える 2

6

スタイルに関しては、2 番目の例の方が見やすいと思います。

他のすべての点では、違いはありません。2 つの関数は、同一のバイトコードにコンパイルされます。

In [3]: dis.dis(size)
  2           0 LOAD_FAST                0 (number)
              3 LOAD_CONST               1 (100)
              6 COMPARE_OP               0 (<)
              9 POP_JUMP_IF_FALSE       19

  3          12 LOAD_GLOBAL              0 (Small)
             15 CALL_FUNCTION            0
             18 RETURN_VALUE        

  5     >>   19 LOAD_FAST                0 (number)
             22 LOAD_CONST               2 (1000)
             25 COMPARE_OP               0 (<)
             28 POP_JUMP_IF_FALSE       38

  6          31 LOAD_GLOBAL              1 (Medium)
             34 CALL_FUNCTION            0
             37 RETURN_VALUE        

  8     >>   38 LOAD_GLOBAL              2 (Big)
             41 CALL_FUNCTION            0
             44 RETURN_VALUE        

In [4]: dis.dis(size1)
 11           0 LOAD_FAST                0 (number)
              3 LOAD_CONST               1 (100)
              6 COMPARE_OP               0 (<)
              9 POP_JUMP_IF_FALSE       19

 12          12 LOAD_GLOBAL              0 (Small)
             15 CALL_FUNCTION            0
             18 RETURN_VALUE        

 13     >>   19 LOAD_FAST                0 (number)
             22 LOAD_CONST               2 (1000)
             25 COMPARE_OP               0 (<)
             28 POP_JUMP_IF_FALSE       38

 14          31 LOAD_GLOBAL              1 (Medium)
             34 CALL_FUNCTION            0
             37 RETURN_VALUE        

 16     >>   38 LOAD_GLOBAL              2 (Big)
             41 CALL_FUNCTION            0
             44 RETURN_VALUE        
             45 LOAD_CONST               0 (None)
             48 RETURN_VALUE        

(100% 正確にするために、2 番目のバージョンには最後に暗黙的なreturn Noneコードがあります。ただし、このコードは到達できないため、パフォーマンスには影響しません。)

于 2012-05-15T11:01:42.367 に答える