これは、私が数日前に答えたフォローアップの質問です。編集:その質問のOPは、私が彼に投稿したコードを使用して同じ質問をしているようですが、私はそれを知りませんでした。謝罪。提供される答えは異なります!
実質的に私はそれを観察しました:
>>> 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ビットを実行しています。python
次のバージョン情報を生成します。
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Python 2.7の逆アセンブリの結果は次のとおりです。
>>> 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
LOAD_CONST(None); RETURN_VALUE
with_else
dis
else
ありFalse
、それらの中で最も遅い(152ns)。2番目に速いのはTrue
なしelse
(143ns)で、他の2つは基本的に同じでした(137nsと138ns)。デフォルトのパラメーターを使用せず%timeit
、iPythonで測定しました。
with_else
は明らかに高速です。