$python 2.7.8
from timeit import timeit
import numpy
timeit("list(0 for i in xrange(0, 100000))", number=1000)
> 8.173301935195923
timeit("[0 for i in xrange(0, 100000)]", number=1000)
> 4.881675958633423
timeit("[0] * 100000", number=1000)
> 0.6624710559844971
timeit('list(itertools.repeat(0, 100000))', 'import itertools', number=1000)
> 1.0820629596710205
您应该使用[0] * n 生成一个带有n 零的列表。
See why [] is faster than list()
但有一个问题,itertools.repeat 和 [0] * n 都会创建其元素引用相同 id 的列表。对于整数或字符串等不可变对象,这不是问题,但如果您尝试创建可变对象列表,如列表列表 ([[]] * n),那么所有元素都将引用同一个对象。
a = [[]] * 10
a[0].append(1)
a
> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
[0] * n 将立即创建列表,而repeat 可用于在首次访问时延迟创建列表。
如果您要处理大量数据并且您的问题不需要可变长度的列表或列表中的多种数据类型,最好使用numpy 数组。
timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000)
> 0.057849884033203125
numpy 数组也会消耗更少的内存。