现在我正在使用一个列表,并期待如下:
verts = list (1000)
我应该使用数组吗?
我想到的第一件事是:
verts = [None]*1000
但你真的需要预先初始化吗?
不太清楚为什么每个人都给你一个很难想要这样做的事情 - 有几种情况你需要一个固定大小的初始化列表.而且你已经正确地推断出在这些情况下阵列是合理的.
import array verts=array.array('i',(0,)*1000)
对于非pythonistas,该(0,)*1000
术语是创建一个包含1000个零的元组.逗号强制python识别(0)
为元组,否则将被评估为0.
我使用了元组而不是列表,因为它们通常具有较低的开销.
一个明显的,可能没有效率的方法是
verts = [0 for x in range(1000)]
请注意,这可以很容易地扩展到二维.例如,要获得10x100"阵列",您可以这样做
verts = [[0 for x in range(100)] for y in range(10)]
在任何编程语言中,想要初始化固定大小的数组是完全可以接受的; 它不像程序员想要在while(true)循环中放入break语句.相信我,特别是如果元素只是被覆盖而不仅仅是添加/减少,就像许多动态编程算法的情况一样,你不想乱用append语句并检查元素是否已被删除即时初始化(这是很多代码gents).
object = [0 for x in range(1000)]
这将适用于程序员正在尝试实现的目标.
@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或其他优化的库要快得多:
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