现在我正在使用一个列表,并期待类似的东西:
verts = list (1000)
我应该用数组代替吗?
现在我正在使用一个列表,并期待类似的东西:
verts = list (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调用预初始化和预编译的代码。
其他回答
这样的:
lst = [8 for i in range(9)]
创建一个列表,元素初始化8
但这:
lst = [0] * 7
会创建7个包含一个元素的列表吗
Wanting to initalize an array of fixed size is a perfectly acceptable thing to do in any programming language; it isn't like the programmer wants to put a break statement in a while(true) loop. Believe me, especially if the elements are just going to be overwritten and not merely added/subtracted, like is the case of many dynamic programming algorithms, you don't want to mess around with append statements and checking if the element hasn't been initialized yet on the fly (that's a lot of code gents).
对象= [0 for x in range(1000)]
这将为程序员试图实现的目标工作。
一个显而易见但可能并不有效的方法是
verts = [0 for x in range(1000)]
注意,这可以很容易地扩展到二维。 例如,要获得一个10x100的“数组”,你可以这样做
verts = [[0 for x in range(100)] for y in range(10)]
你可以这样做:
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调用预初始化和预编译的代码。