2017-10-06 4 views
-1

以下のように私はタプルをした:私はそれをリストに変換したいタプルからリストへの変換の動作を理解する:list(t)または[* t]は良いですか?

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

l=list(t) 

のまっすぐな方法があるが、以下には、より多くのであれば、私は理解したかったです、非効率的な場合は、どのような方法で?

l=[*t] 

list(tuple)対任意のオーバーヘッドを持って開梱し、リストに戻ってそれを梱包場合、これは理解するよりです。

2つのベンチマークを行い、ここに結果を投稿しますが、誰かがある程度の洞察力を払うことができれば、それは素晴らしいことでしょう。

+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 

分解は、関数法の解体は、開梱方法上の1つの追加の関数呼び出しが必要であることを示しています。タイミングの結果は、期待どおり、組み込み演算子を使用した場合の関数呼び出しのオーバーヘッドが実行時間の大幅な増加を引き起こすことを示しています。

実行時間だけでは、アンパックはより効率的です。しかし、実行時間は方程式の1つの部分に過ぎないことに注意してください。これは読みやすさと場合によってはメモリ消費(ベンチマークするのが難しい)とのバランスをとる必要があります。ほとんどの場合、読むのが簡単であるため、関数を使うことをお勧めします。このコードが頻繁に(長時間実行されているループのように)実行されている場合は、アンパック方法に切り替えるだけです。がスクリプトのクリティカルパスにあります。

関連する問題