在Python中,性能更好:
1)
for i in range(len(a[:-1])):
foo()
或
2)
for i in range(len(a)-1):
foo()
更新
关于我为什么循环索引(非惯用语?)的一些背景:
for c in reversed(range(len(self._N)-1)):
D[c] = np.dot(self._W[c], D[c-1])*A[c]*(1-A[c])
答案 0 :(得分:4)
第二个更好,有两个原因:
第一个创建了一个新列表a[:-1]
,占用了不必要的时间&记忆,第二个没有创建新列表。
第二个更直观,更清晰。
[:]返回列表的
shallow copy
。这意味着每个切片表示法返回一个在内存中有新地址的列表,但其元素将具有与源列表元素相同的地址。
答案 1 :(得分:3)
range(0, len(a) - 1)
应该更有效地完成2个选项。另一个制作序列的不必要的副本(sans 1元素)。对于像这样的循环,你甚至可以通过在python2.x上使用xrange
来提高性能,因为这样可以避免在range
调用中实现列表。
当然,你通常不需要在python中循环索引 - 这通常是更好的方法。
答案 2 :(得分:2)
表达式a[:-1]
创建一个新列表,您可以为其获取长度并放弃列表。与 O (1)第二个示例的时间和空间复杂度相比,这是 O (n)时间和空间复杂度。
答案 3 :(得分:1)
也不是正确的方式
for i,item in enumerate(a[:-1]):
...
你应该怎么做......
一般在python中你永远不应该做
for i in range(len(a_list)): ...
这里是时间差异
>>> timeit.timeit("for i in range(len(a)-1):x=i","a=range(1000000)",number=100)
3.30806345671283
>>> timeit.timeit("for i in enumerate(a[:-1]):x=i","a=range(1000000)",number=100
5.3319918613661201
你可以看到在一大堆整数上花费额外的2秒钟来做100次......但是它仍然是一个更好的主意imho