これはan answer I gave a few days backへのフォローアップの質問です。 編集:その質問のOPには、私が彼に投稿したコードを使用してthe same questionと尋ねたようだが、私はそれを知らなかった。謝罪。ただし、提供される回答は異なります!早期返却はなぜ他のものより遅いのですか?
>>> def without_else(param=False):
... if param:
... return 1
... return 0
>>> def with_else(param=False):
... if param:
... return 1
... else:
... return 0
>>> from timeit import Timer as T
>>> T(lambda : without_else()).repeat()
[0.3011460304260254, 0.2866089344024658, 0.2871549129486084]
>>> T(lambda : with_else()).repeat()
[0.27536892890930176, 0.2693932056427002, 0.27011704444885254]
>>> T(lambda : without_else(True)).repeat()
[0.3383951187133789, 0.32756996154785156, 0.3279120922088623]
>>> T(lambda : with_else(True)).repeat()
[0.3305950164794922, 0.32186388969421387, 0.3209099769592285]
...または他の言葉で:
は、実質的に私はその観察else
句は関係なく、トリガーされるif
条件のかをより高速です。
私はそれが2つの異なるバイトコードと関係していると仮定しますが、詳細に確認/説明できる人はいますか?
編集:誰も私のタイミングを再現することはできないようですので、私のシステムにいくつかの情報を与えることが有用かもしれないと思った。私はデフォルトのPythonがインストールされたUbuntu 11.10 64ビットを実行しています。
>>> dis.dis(without_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
4 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
>>> dis.dis(with_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
5 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
私は今見つけることができないので、同じ質問がありました。彼らは生成されたバイトコードをチェックし、追加のステップが1つありました。観察された差異は、テスター(マシン、SO ..)に非常に依存していました。 – joaquin
3.xでは、どちらも '**_with_else'の最後にいくつかの到達不能なコード(' LOAD_CONST(なし); RETURN_VALUE' - しかし、それは決して到達していません)の** ** **バイトコードを生成します。私はデッドコードが機能をより速くすることを非常に疑う。誰かが2.7で 'dis'を提供できますか? – delnan
私はこれを再現できませんでした。 'else'と' False'を使った関数はそれらの中で最も遅かった(152ns)。 2番目に速いのは「その他」のない「真」(143ns)であり、他の2つは基本的に同じ(137nsと138ns)でした。私はデフォルトのパラメータを使用せず、iPythonの '%timeit'でそれを測定しました。 – rplnt