2012-12-21 51 views
0

我只是在做一些快速的性能測試,我注意到初始化一個列表一般比明確的慢四到六倍(這些可能是錯誤的術語,我不確定這裏的術語)。例如:Python對象初始化性能

>>> import timeit 
>>> print timeit.timeit('l = list()', number = 10000000) 
1.66420578957 
>>> print timeit.timeit('l = []',  number = 10000000) 
0.448561906815 

而且具有同樣元組和整數:

>>> print timeit.timeit('l = tuple()', number = 10000000) 
1.10791182518 
>>> print timeit.timeit('l =()',  number = 10000000) 
0.23167181015 

>>> print timeit.timeit('l = int()', number = 10000000) 
1.3009660244 
>>> print timeit.timeit('l = 0',  number = 10000000) 
0.232784032822 

這是爲什麼?

回答

2

這是因爲使用文字語法,python知道建立一個字節碼的列表。調用構造函數需要仰視list全球,把它改爲:

>>> def foo(): [] 
... 
>>> dis.dis(foo) 
    1   0 BUILD_LIST    0 
       3 POP_TOP    
       4 LOAD_CONST    0 (None) 
       7 RETURN_VALUE   
>>> def bar(): list() 
... 
>>> dis.dis(bar) 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 POP_TOP    
       7 LOAD_CONST    0 (None) 
      10 RETURN_VALUE   
6

使用dis module檢查字節碼:

import dis   
dis.dis(lambda: list()) 

產生

6   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 RETURN_VALUE   

dis.dis(lambda: []) 

產量

7   0 BUILD_LIST    0 
       3 RETURN_VALUE   

所以list()需要查找一個全局名稱和調用對象,而[]沒有。

2

不同的字節碼。以list() VS []爲例:

l = list(): 
    1   0 LOAD_GLOBAL    0 (list) 
       3 CALL_FUNCTION   0 
       6 STORE_FAST    0 (l) 

l = []: 
    1   0 BUILD_LIST    0 
       3 STORE_FAST    0 (l) 

前者涉及名稱查找爲"list"和函數調用。