现在我正在使用一个列表,并期待类似的东西:
verts = list (1000)
我应该用数组代替吗?
现在我正在使用一个列表,并期待类似的东西:
verts = list (1000)
我应该用数组代替吗?
当前回答
这样的:
lst = [8 for i in range(9)]
创建一个列表,元素初始化8
但这:
lst = [0] * 7
会创建7个包含一个元素的列表吗
其他回答
你可以这样做:
verts = list(xrange(1000))
这将为您提供一个大小为1000个元素的列表,并且恰巧初始化值为0-999。由于list首先执行__len__来调整新列表的大小,因此应该相当有效。
您应该考虑使用字典类型而不是预先初始化的列表。字典查找的开销很小,与访问任意列表元素的开销相当。
当使用映射时,你可以这样写:
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调用预初始化和预编译的代码。
一个显而易见但可能并不有效的方法是
verts = [0 for x in range(1000)]
注意,这可以很容易地扩展到二维。 例如,要获得一个10x100的“数组”,你可以这样做
verts = [[0 for x in range(100)] for y in range(10)]
如果不了解问题领域的更多信息,就很难回答您的问题。 除非你确定你需要做更多的事情,否则python初始化列表的方法是:
verts = []
您是否真的看到了性能问题?如果有,性能瓶颈是什么? 不要试图去解决一个你没有的问题。动态地将数组填充到1000个元素的性能代价可能与您真正试图编写的程序完全无关。
数组类是有用的,如果你的列表中的东西总是一个特定的基本固定长度类型(例如char, int, float)。但是,它也不需要预初始化。
我首先想到的是:
verts = [None]*1000
但是你真的需要初始化它吗?