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

Python 为什么list()、dict()和tuple()比[]、{}和()慢?,python,Python,我最近研究了在需要创建三者中的一个空值时,分别使用list()、dict()、tuple()代替[]、{}和()。理由是它看起来更具可读性。我本来想征求大家对风格的意见,但后来我决定测试一下性能。我这样做: >>> from timeit import Timer >>> Timer('for x in range(5): y = []').timeit() 0.59327821802969538 >>> from timeit import

我最近研究了在需要创建三者中的一个空值时,分别使用
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()
,每个的函数调用版本都比语法版本(
{}
[]
()
)糟糕得难以置信,因此,我有3个问题:

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

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

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

    >>> 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        
    >>>
    
    回答#3


    默认情况下,实际重复您的程序100万次。因此,事实上,您正在1.2秒内创建500万个列表。

    re:style-opinion-我经常使用[]。我想这已经足够清楚了。不过,性能问题很有趣。在习惯python之前,python有很多东西看起来很奇怪。我总是更喜欢
    []
    而不是
    list()
    ,因为
    list()
    实际上可能不是
    \uuuuuuuuuuuu内置的.list
    。买家要小心。
    []
    不是任何东西的语法糖。这是一个列表文字。麦克盖:这确实是一个语法糖。可以通过调用
    list()
    生成列表,但编译器会将相应上下文中的方括号解释为创建列表。当遇到
    []
    时,编译器不会调用
    list()
    。看看我的答案。
      >>> 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