(tl;dr:对您的问题的确切答案是numpy.empty或numpy.empty_like,但是您可能不在乎,可以使用myList = [None]*10000。)
简单方法
您可以将列表初始化为所有相同的元素。使用一个非数字值(如果以后使用它会给出一个错误,这是一件好事)或类似于0(不寻常)的东西是否在语义上有意义?如果您正在编写稀疏矩阵或“默认”值应为0且不担心错误,则可能有用)取决于您:>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]
(这里_只是一个变量名,您可以使用i。)
您也可以这样做:>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]
你可能不需要优化这个。还可以在每次需要时追加到数组中:>>> x = []
>>> for i in range(10):
>>> x.append(i)
简单方法的性能比较
哪个最好?>>> def initAndWrite_test():
... x = [None]*10000
... for i in range(10000):
... x[i] = i
...
>>> def initAndWrite2_test():
... x = [None for _ in range(10000)]
... for i in range(10000):
... x[i] = i
...
>>> def appendWrite_test():
... x = []
... for i in range(10000):
... x.append(i)
在python2.7中的结果:>>> import timeit
>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]:
... print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000))
...
initAndWrite_test takes 714.596033096 usec/loop
initAndWrite2_test takes 981.526136398 usec/loop
appendWrite_test takes 908.597946167 usec/loop
python 3.2中的结果:initAndWrite_test takes 641.3581371307373 usec/loop
initAndWrite2_test takes 1033.6499214172363 usec/loop
appendWrite_test takes 895.9040641784668 usec/loop
如我们所见,在python2和python3中使用习惯用法[None]*10000可能更好。然而,如果一个人正在做比赋值更复杂的事情(比如生成或处理列表中的每个元素都很复杂的事情),那么开销将成为毫无意义的成本的一小部分。也就是说,如果您对列表中的元素做了任何合理的处理,那么这样的优化还为时过早。
未初始化内存
这些都是无效的,因为它们通过内存,在过程中写东西。在C语言中,这是不同的:未初始化的数组充满了随机垃圾内存(附带说明:它已经从系统中重新分配,当您分配或未能锁定和/或在关闭程序时未能删除内存时,它可以是security risk)。这是一个为加速而设计的选择:C语言的制作者认为最好不要自动初始化内存,这是正确的选择。
这不是渐进加速(因为它是O(N)),但例如,在覆盖实际关心的内容之前,您不需要首先初始化整个内存块。如果可能的话,这相当于(伪代码)x = list(size=10000)。
如果您想在python中使用类似的东西,可以使用numpy数值矩阵/N维数组操作包。具体来说,^{}或^{}
这才是你问题的真正答案。