为什么list(),dict()和tuple()比[],{}和()慢?

时间:2010-11-22 02:23:03

标签: python

我最近分别使用list()dict()tuple()代替[]{}()当需要创建三个中的空的一个。原因是它看起来更具可读性。我打算就风格征求意见,但后来我决定测试性能。我这样做了:

>>> from timeit import Timer
>>> Timer('for x in range(5): y = []').timeit()
0.59327821802969538
>>> from timeit import Timer
>>> Timer('for x in range(5): y = list()').timeit()
1.2198944904251618

我尝试了dict()tuple()list(),并且每个函数调用版本都比语法版本({} [],{{ 1}})所以,我有3个问题:

  1. 为什么函数调用更贵?
  2. 为什么会有这么大的差异?
  3. 为什么要在我的计时器中创建5个空列表需要1.2秒?我知道()会关闭垃圾收集,但考虑到我只使用timeit时,这可能不会产生影响。

4 个答案:

答案 0 :(得分:18)

函数调用需要变量名查找,然后是函数调用。然后调用的函数创建一个列表并返回它。列表语法文字使解释器只能创建一个列表:

>>> import dis
>>> foo = lambda :[]
>>> bar = lambda :list()
>>> dis.dis(foo)
  1           0 BUILD_LIST               0
              3 RETURN_VALUE        
>>> dis.dis(bar)
  1           0 LOAD_GLOBAL              0 (list)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE        
>>>

答案 1 :(得分:5)

回答#3。

timeit默认情况下会重复您的程序1 000 000次。事实上,你在1.2秒内创建了500万个列表。

答案 2 :(得分:2)

  >>> from dis import dis

  >>> dis(lambda: list())
  1           0 LOAD_GLOBAL              0 (list)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE        

  >>> dis(lambda: [])
  1           0 BUILD_LIST               0
              3 RETURN_VALUE        

答案 3 :(得分:0)

要查找dicttuplelist,需要进行范围查找,并且需要搜索多个范围才能找到它们。使用语法糖,编译器可以知道需要创建特定对象,因此可以发出正确的字节码来执行此操作。