在Python中创建空列表

在Python中创建空列表,python,performance,list,coding-style,timeit,Python,Performance,List,Coding Style,Timeit,在Python中创建新空列表的最佳方法是什么 l = [] 或 我这样问是因为两个原因: 技术原因,关于哪个更快。(创建类会导致开销? 代码可读性-哪一个是标准约定 以下是如何测试哪段代码更快: % python -mtimeit "l=[]" 10000000 loops, best of 3: 0.0711 usec per loop % python -mtimeit "l=list()" 1000000 loops, best of 3: 0.297 usec per loop

在Python中创建新空列表的最佳方法是什么

l = [] 

我这样问是因为两个原因:

  • 技术原因,关于哪个更快。(创建类会导致开销?
  • 代码可读性-哪一个是标准约定

  • 以下是如何测试哪段代码更快:

    % python -mtimeit  "l=[]"
    10000000 loops, best of 3: 0.0711 usec per loop
    
    % python -mtimeit  "l=list()"
    1000000 loops, best of 3: 0.297 usec per loop
    
    然而,在实践中,这种初始化很可能是程序中非常小的一部分,因此担心这一点可能是错误的

    可读性是非常主观的。我更喜欢
    []
    ,但一些非常有学问的人,比如亚历克斯·马泰利,更喜欢
    list()
    ,因为。

    list()
    天生比
    []
    慢,因为

  • 还有符号查找(如果您不只是将列表重新定义为其他内容,python就无法提前知道!)

  • 有函数调用

  • 然后,它必须检查是否传递了iterable参数(这样它就可以用其中的元素创建列表)。在我们的例子中没有,但有“if”检查

  • 但是,在大多数情况下,速度差不会产生任何实际影响。

    我使用
    []

  • 它更快,因为列表符号是短路
  • 创建包含项目的列表应该与创建不包含项目的列表大致相同,为什么会有差异

  • 我真的不知道这一点,但在我看来,根据经验,jpcgt实际上是正确的。下面的示例:如果我使用以下代码

    t = [] # implicit instantiation
    t = t.append(1)
    
    在解释器中,调用t只会给我“t”,没有任何列表,如果我附加了其他内容,例如

    t = t.append(2)
    
    我得到错误“'NoneType'对象没有属性'append'”。但是,如果我通过

    t = list() # explicit instantiation
    

    然后它就可以正常工作了。

    只需突出显示@Darkonaut,因为我认为它应该更清晰可见


    new\u list=[]
    new\u list=list()
    都很好(忽略性能),但是
    append()
    返回
    None
    ,因此您无法执行
    new\u list=new\u list。append(某物)

    +1:理解
    list()
    []
    慢的原因感觉很好!在
    list()
    的情况下,它只需检查是否有任何参数。。。“检查是否可编辑”和“创建包含元素的列表”不会发生;它们仅在存在arg时适用。甚至有可能
    []
    的C代码调用与
    list()
    相同的C代码。无论如何,(c)所涉及的时间与(a)+(b)相比是微不足道的。@johnmachin-很抱歉搞混了,我在(c)中的意思是,它需要检查是否有争论,是的。剩下的是关于如果有争论会发生什么,在我们的例子中没有,谢谢你的分析。我一直想知道它是如何实现的。为什么
    list(“”)
    给出的是
    []
    而不是
    ['']
    ?这是因为这个函数从iterable类型生成列表,您不能插入多个参数。(试着键入
    list('abcd')
    ,你就能“更快地”理解一切)?为什么不运行timeit?这是因为
    t.append(1)
    在适当的位置修改
    t
    ,它只返回
    None
    ,而您正在将此
    None
    分配给
    t
    。因此
    t
    现在指的是
    None
    ,而不是列表。您的错误是编写了
    t=t.append(1)
    ,而不是只编写
    t.append(1)
    。你会注意到
    list()
    有同样的行为,所以这里没有区别。
    t = list() # explicit instantiation