在Python中创建一个空列表


243

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

l = [] 

要么

l = list()

我之所以这样问是因为两个原因:

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

4
“快点”?你为什么不运行timeit?
S.Lott

Answers:


335

您可以通过以下方法测试哪段代码更快:

% 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()因为它很明显


12
哇,谢谢您的分析。我一直想知道它是如何完成的。
user225312 2010年

为什么list('')[]而不是['']
Chris_Rands

这是因为此func make列表来自可迭代类型,因此您无法插入多个参数。(尝试打字list('abcd'),您就会明白所有内容)
Ivan Lavrenov

133

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

  1. 有符号查找(python不能事先知道您是否不只是将列表重新定义为其他内容!),

  2. 有函数调用,

  3. 然后它必须检查是否传递了可迭代的参数(以便它可以使用其中的元素创建列表)。在我们的情况下没有,但是有“如果”检查

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


38
+1:了解为什么list()慢于感觉很好[]
Eric O Lebigot

2
在这种情况下,list()它只需要检查是否有任何arg……就不会发生“检查是否可迭代”和“使用元素创建列表”;它们仅在有arg的情况下适用。C代码甚至有可能[]调用与相同的C代码list()。在任何情况下,与(a)+(b)相比,(c)所涉及的时间都很少。
John Machin 2010年

1
@John Machin-抱歉,我在(c)中的意思是它需要检查是否有争论,是的。剩下的就是有争论的情况下会发生什么,在我们的情况下没有争论
Nas Banov 2010年

16

我用[]

  1. 速度更快,因为列表符号是短路。
  2. 创建包含项目的列表应该创建不包含项目的列表大致相同,为什么会有区别呢?

3

我并不是很了解,但是根据我的经验,jpcgt实际上是正确的。以下示例:如果我使用以下代码

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

在解释器中,然后调用t给我“ t”,不带任何列表,如果我附加其他内容,例如

t = t.append(2)

我收到错误“'NoneType'对象没有属性'append'”。但是,如果我通过以下方式创建列表

t = list() # explicit instantiation

然后就可以了


15
这是因为就地t.append(1)修改t,它不返回任何内容,而是None您将其分配Nonet。因此,t现在参考None而不是列表。您在这里的错误是写作,t=t.append(1)而不仅仅是写作t.append(1)。您会注意到与的行为相同list(),因此这里没有区别。
Darkonaut

1

只是强调@Darkonaut 答案因为我认为它应该更明显。

new_list = []new_list = list()两者都很好(忽略性能),但append()返回None,结果您无法做new_list = new_list.append(something

这种返回类型的决定让我感到非常困惑。uck

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.