これはコメントに表示するにはあまりにも難しいです:これまでに述べたコメントよりもここには多くの(または少ない;-))があります。 a()
あなたが示したように定義b()
では、の上で行ってみましょう:
>>> from dis import dis
>>> dis(b)
2 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
何が起こることはCPythonのコンパイラはif 0:
またはif 1:
を見たとき、それはコンパイル時でそれらを評価し、任意のコードを生成しませんということです実行時にテストを行います。したがって、b()
のコードはNone
をロードして返します。
しかしa()
のために生成されたコードははるかに複雑である:
>>> dis(a)
2 0 LOAD_CONST 1 (0)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
>> 16 LOAD_CONST 0 (None)
19 RETURN_VALUE
何もこの場合には、コンパイル時に評価されていない - それは、すべての実行時に行われます。だからa()
ははるかに遅いです。
それ以外にも、@Charles Duffyのコメント:マイクロ最適化についての心配は通常、Pythonでは逆効果です。しかし、もしあなたが;-)でなければならない場合は、dis.dis
の使い方を学んでください。総計この特定のケースで起こったように、生成されたコードの違い。
変数 'x'の型を定義しない限り、この質問に対する回答はありません。 –
'b'は' 0'が偽であるのでより高速ですが、他のすべての数字は真実ですので、2つではなく1つの操作しか実行しません。 –
@EliSadoff ...私は確かにaが高速だったクラスを書くことができました。つまり、あなたが前提をしていると言えます。 :) –