timeitとdisモジュールでは、これを確認するのはかなり簡単です。私は一緒にこのスクリプトを平手打ち:
import timeit
import dis
def func(t):
return list(t)
def unpack(t):
return [*t]
def func_wrapper():
t = (1,2,3,4,5,6)
func(t)
def unpack_wrapper():
t = (1,2,3,4,5,6)
unpack(t)
print("Disassembly with function:")
print(dis.dis(func))
print("Dissassembly with unpack:")
print(dis.dis(unpack))
print("Func time:")
print(timeit.timeit(func_wrapper, number=10000))
print("Unpack time:")
print(timeit.timeit(unpack_wrapper, number=10000))
と実行、それはこの出力を示しています
Disassembly with function:
5 0 LOAD_GLOBAL 0 (list)
2 LOAD_FAST 0 (t)
4 CALL_FUNCTION 1
6 RETURN_VALUE
None
Dissassembly with unpack:
8 0 LOAD_FAST 0 (t)
2 BUILD_LIST_UNPACK 1
4 RETURN_VALUE
None
Func time:
0.002832347317420137
Unpack time:
0.0016913349487029865
分解は、関数法の解体は、開梱方法上の1つの追加の関数呼び出しが必要であることを示しています。タイミングの結果は、期待どおり、組み込み演算子を使用した場合の関数呼び出しのオーバーヘッドが実行時間の大幅な増加を引き起こすことを示しています。
実行時間だけでは、アンパックはより効率的です。しかし、実行時間は方程式の1つの部分に過ぎないことに注意してください。これは読みやすさと場合によってはメモリ消費(ベンチマークするのが難しい)とのバランスをとる必要があります。ほとんどの場合、読むのが簡単であるため、関数を使うことをお勧めします。このコードが頻繁に(長時間実行されているループのように)実行されている場合は、アンパック方法に切り替えるだけです。とがスクリプトのクリティカルパスにあります。
ベンチマークしてください。 – BartoszKP
timeitを使用していますか? – kaza
'%timeit list(t)' 3つのうち最高のもの:294 ns /ループ '%timeit [* t]' 3つのループの中で最高の176 ns –