【发布时间】:2011-02-27 16:04:49
【问题描述】:
在 Python 中创建新的空列表的最佳方法是什么?
l = []
或
l = list()
我问这个有两个原因:
- 技术原因,至于哪个更快。 (创建类会导致开销?)
- 代码可读性 - 哪个是标准约定。
【问题讨论】:
-
“更快”?为什么不运行 timeit?
标签: python performance list coding-style timeit
在 Python 中创建新的空列表的最佳方法是什么?
l = []
或
l = list()
我问这个有两个原因:
【问题讨论】:
标签: python performance list coding-style timeit
以下是测试哪段代码更快的方法:
% 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('') 给[] 而不是['']?
list('abcd'),你就明白了)
list() 本质上比[] 慢,因为
有符号查找(如果您不只是将列表重新定义为其他内容,python 无法提前知道!),
有函数调用,
然后它必须检查是否传递了可迭代参数(因此它可以从中创建包含元素的列表)ps。在我们的例子中没有,但有“if”检查
但在大多数情况下,速度差异不会产生任何实际差异。
【讨论】:
list() 比[] 慢!
list() 的情况下,它只需要检查是否有任何参数......“检查是否可迭代”和“使用元素创建列表”就不会发生;它们仅适用于存在 arg 的情况。 [] 的 C 代码甚至可能调用与 list() 相同的 C 代码。无论如何,与 (a) + (b) 相比,(c) 所涉及的时间会很小。
我使用[]。
【讨论】:
我真的不知道,但在我看来,根据经验,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() 的行为相同,因此这里没有区别。
只是为了突出显示@Darkonaut answer,因为我认为它应该更明显。
new_list = [] 或new_list = list() 都可以(忽略性能),但append() 返回None,结果你不能做new_list = new_list.append(something)。
【讨论】: