现在我正在使用一个列表,并期待类似的东西:

verts = list (1000)

我应该用数组代替吗?


当前回答

如果不了解问题领域的更多信息,就很难回答您的问题。 除非你确定你需要做更多的事情,否则python初始化列表的方法是:

verts = []

您是否真的看到了性能问题?如果有,性能瓶颈是什么? 不要试图去解决一个你没有的问题。动态地将数组填充到1000个元素的性能代价可能与您真正试图编写的程序完全无关。

数组类是有用的,如果你的列表中的东西总是一个特定的基本固定长度类型(例如char, int, float)。但是,它也不需要预初始化。

其他回答

你可以这样做:

verts = list(xrange(1000))

这将为您提供一个大小为1000个元素的列表,并且恰巧初始化值为0-999。由于list首先执行__len__来调整新列表的大小,因此应该相当有效。

如果不了解问题领域的更多信息,就很难回答您的问题。 除非你确定你需要做更多的事情,否则python初始化列表的方法是:

verts = []

您是否真的看到了性能问题?如果有,性能瓶颈是什么? 不要试图去解决一个你没有的问题。动态地将数组填充到1000个元素的性能代价可能与您真正试图编写的程序完全无关。

数组类是有用的,如果你的列表中的东西总是一个特定的基本固定长度类型(例如char, int, float)。但是,它也不需要预初始化。

我首先想到的是:

verts = [None]*1000

但是你真的需要初始化它吗?

您应该考虑使用字典类型而不是预先初始化的列表。字典查找的开销很小,与访问任意列表元素的开销相当。

当使用映射时,你可以这样写:

aDict = {}
aDict[100] = fetchElement()
putElement(fetchElement(), fetchPosition(), aDict)

putElement函数可以将item存储在任何给定的位置。如果你需要检查你的集合是否包含给定索引的元素,那么更python化的做法是:

if anIndex in aDict:
    print "cool!"

比:

if not myList[anIndex] is None:
    print "cool!"

因为后者假设集合中没有真正的元素可以是None。如果发生这种情况,你的代码就会出错。

如果你迫切需要性能,这就是为什么你试图预初始化你的变量,并编写尽可能快的代码-改变你的语言。最快的代码不能用Python编写。您应该尝试使用C语言,并实现包装器来从Python调用预初始化和预编译的代码。

不太清楚为什么每个人都给你这样做的困难时间-有几种情况下,你需要一个固定大小的初始化列表。你已经正确地推断出数组在这种情况下是可行的。

import array
verts=array.array('i',(0,)*1000)

对于非python爱好者,(0,)*1000项创建的是包含1000个零的元组。逗号迫使python将(0)识别为元组,否则它将被求值为0。

我使用元组而不是列表,因为它们通常有更低的开销。