这提供了更好的性能:len(a [: - 1])或len(a)-1

时间:2014-04-23 03:45:17

标签: python range slice

在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])

4 个答案:

答案 0 :(得分:4)

第二个更好,有两个原因:

  1. 第一个创建了一个新列表a[:-1]占用了不必要的时间&记忆,第二个没有创建新列表。

  2. 第二个更直观,更清晰。

  3.   

    [:]返回列表的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