使用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
拆卸顯示功能的方法的拆卸需要一個額外的函數調用在拆包方法。計時結果表明,正如預期的那樣,使用內置操作符的函數調用的開銷會導致執行時間的顯着增加。
僅通過執行時間,解包就更「高效」。但請記住,執行時間只是等式的一部分 - 這必須與可讀性以及某些情況下的內存消耗(這很難進行基準測試)保持平衡。在大多數情況下,我會建議你堅持使用該功能,因爲它更易於閱讀。如果此代碼頻繁執行(如在長時間運行的循環中),則只會切換到解包方法和位於腳本的關鍵路徑中。
基準測試並親自查看。 – BartoszKP
可能使用timeit? – kaza
'%timeit list(t)'最好的3:每個迴路294 ns '%timeit [* t]'最好的3:每個迴路176 ns –