Python对象初始化性能

时间:2012-12-21 13:42:14

标签: 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

为什么会这样?

3 个答案:

答案 0 :(得分: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()需要查找全局名称并调用该对象,而[]则不需要。

答案 1 :(得分: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        

答案 2 :(得分: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"的名称查找和函数调用。