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

oro*_*aki 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

Sin*_*ion 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        
>>>
Run Code Online (Sandbox Code Playgroud)


Kug*_*gel 5

回答#3.

timeit实际上默认重复你的程序1 000 000次.所以实际上,你在1.2秒内创建了500万个列表.