2017-10-06 51 views
-1

我有如下一個元組:瞭解元組以列出轉換行爲:列表(t)或[* t]哪個更好?

t=(1,2,3,4,5,6) 

我想將其轉換爲一個列表,雖然是

l=list(t) 

我想了解,如果下面是一個更直接的方式效率低下,如果是這樣的話?

l=[*t] 

這更多的是理解,如果拆包和包裝它放回列表中有任何開銷VS list(tuple)

我會嘗試對兩者進行基準測試並在此處發佈結果,但是如果有人能夠提出一些見解,那就太棒了。

+0

基準測試並親自查看。 – BartoszKP

+0

可能使用timeit? – kaza

+0

'%timeit list(t)'最好的3:每個迴路294 ns '%timeit [* t]'最好的3:每個迴路176 ns –

回答

5

使用timeitdis模塊可以很容易地檢查自己。我拼湊此腳本:

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 

拆卸顯示功能的方法的拆卸需要一個額外的函數調用在拆包方法。計時結果表明,正如預期的那樣,使用內置操作符的函數調用的開銷會導致執行時間的顯着增加。

僅通過執行時間,解包就更「高效」。但請記住,執行時間只是等式的一部分 - 這必須與可讀性以及某些情況下的內存消耗(這很難進行基準測試)保持平衡。在大多數情況下,我會建議你堅持使用該功能,因爲它更易於閱讀。如果此代碼頻繁執行(如在長時間運行的循環中),則只會切換到解包方法位於腳本的關鍵路徑中。