【问题标题】:Creating an empty list in Python在 Python 中创建一个空列表
【发布时间】:2011-02-27 16:04:49
【问题描述】:

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

l = [] 

l = list()

我问这个有两个原因:

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

【问题讨论】:

  • “更快”?为什么不运行 timeit?

标签: python performance list coding-style timeit


【解决方案1】:

以下是测试哪段代码更快的方法:

% 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

但是,在实践中,这种初始化很可能是您程序的极小部分,因此担心这一点可能是错误的。

可读性是非常主观的。我更喜欢[],但一些知识渊博的人,比如Alex Martelli,更喜欢list(),因为it is pronounceable

【讨论】:

  • 哇,感谢您的分析。我一直想知道它是怎么做到的。
  • 为什么list('')[] 而不是['']
  • 这是因为这个函数从可迭代类型中创建列表,你不能插入超过 1 个参数。 (尝试输入list('abcd'),你就明白了)
【解决方案2】:

list() 本质上比[] 慢,因为

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

  2. 有函数调用,

  3. 然后它必须检查是否传递了可迭代参数(因此它可以从中创建包含元素的列表)ps。在我们的例子中没有,但有“if”检查

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

【讨论】:

  • +1:很高兴能理解为什么list()[] 慢!
  • list() 的情况下,它只需要检查是否有任何参数......“检查是否可迭代”和“使用元素创建列表”就不会发生;它们仅适用于存在 arg 的情况。 [] 的 C 代码甚至可能调用与 list() 相同的 C 代码。无论如何,与 (a) + (b) 相比,(c) 所涉及的时间会很小。
  • @John Machin - 很抱歉造成混淆,我在 (c) 中的意思是它需要检查是否存在争论,是的。剩下的就是如果有争论会发生什么,在我们的例子中没有
【解决方案3】:

我使用[]

  1. 它更快,因为列表符号是短路的。
  2. 使用项创建列表应该与创建没有列表的列表大致相同,为什么会有区别?

【讨论】:

    【解决方案4】:

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

    t = [] # implicit instantiation
    t = t.append(1)
    

    在解释器中,然后调用 t 给我的只是 "t" 没有任何列表,如果我附加其他内容,例如

    t = t.append(2)
    

    我收到错误“'NoneType' 对象没有属性 'append'”。但是,如果我通过

    创建列表
    t = list() # explicit instantiation
    

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

    【讨论】:

    • 这是因为t.append(1) 修改了t,它只返回None,并且您将这个None 分配给t。所以t 现在指的是None 而不是列表。你的错误是写t=t.append(1) 而不是t.append(1)。您会注意到 list() 的行为相同,因此这里没有区别。
    【解决方案5】:

    只是为了突出显示@Darkonaut answer,因为我认为它应该更明显。

    new_list = []new_list = list() 都可以(忽略性能),但append() 返回None,结果你不能做new_list = new_list.append(something)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2012-05-29
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多