@Steve 已经很好地回答了你的问题:
verts = [None] * 1000
警告:正如@Joachim Wuttke 指出的,列表必须使用不可变元素进行初始化。 [[]] * 1000 无法按预期工作,因为您将获得一个包含 1000 个相同列表的列表(类似于 C 中相同列表的 1000 个点的列表)。像 int、str 或 tuple 这样的不可变对象就可以了。
替代方案
调整列表大小很慢。以下结果并不令人惊讶:
>>> N = 10**6
>>> %timeit a = [None] * N
100 loops, best of 3: 7.41 ms per loop
>>> %timeit a = [None for x in xrange(N)]
10 loops, best of 3: 30 ms per loop
>>> %timeit a = [None for x in range(N)]
10 loops, best of 3: 67.7 ms per loop
>>> a = []
>>> %timeit for x in xrange(N): a.append(None)
10 loops, best of 3: 85.6 ms per loop
但如果您没有非常大的列表,则调整大小不会很慢。与其使用单个元素(例如None)和固定长度来初始化列表以避免列表大小调整,不如考虑使用列表推导并直接用正确的值填充列表。例如:
>>> %timeit a = [x**2 for x in xrange(N)]
10 loops, best of 3: 109 ms per loop
>>> def fill_list1():
"""Not too bad, but complicated code"""
a = [None] * N
for x in xrange(N):
a[x] = x**2
>>> %timeit fill_list1()
10 loops, best of 3: 126 ms per loop
>>> def fill_list2():
"""This is slow, use only for small lists"""
a = []
for x in xrange(N):
a.append(x**2)
>>> %timeit fill_list2()
10 loops, best of 3: 177 ms per loop
与 numpy 的比较
对于庞大的数据集,numpy 或其他优化的库要快得多:
from numpy import ndarray, zeros
%timeit empty((N,))
1000000 loops, best of 3: 788 ns per loop
%timeit zeros((N,))
100 loops, best of 3: 3.56 ms per loop