[N, N-1, ..., 0]
在 python中获取列表的最佳方法是什么?我有两种方法
>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(9, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[N, N-1, ..., 0]
在 python中获取列表的最佳方法是什么?我有两种方法
>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(9, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
range(N, -1, -1) is better
您可以看到它花费的时间要少得多:
N = 10000
%timeit range(N+1)[::-1]
1000000 loops, best of 3: 767 ns per loop
%timeit range(N, -1, -1)
1000000 loops, best of 3: 334 ns per loop
在range(N+1)[::-1]
中,您首先要做与列表完全相同的事情range(N, -1, -1)
,然后反转列表,这就是为什么需要更多时间的原因。
如果您的数字列表可能很大,或者您实际上并不需要该列表,而只是在该范围内进行迭代,则可以通过使用来避免实际创建列表
xrange(N, -1, -1)
正如 Rob 在下面的评论中提到的,这种行为是 Python 3 下的新默认行为(返回生成器而不是实际列表),但对于 Python 2,您可以range()
返回一个列表并xrange()
返回一个生成器。
import timeit
print timeit.timeit("range(10)[::-1]", number=10000000)
print timeit.timeit("range(9, -1, -1)", number=10000000)
在我的机器上输出
2.99922299385
2.24587512016
看起来第二个稍微快一点,所以使用range(9, -1, -1)
您的第二种方法是触摸更快:
%timeit range(9,-1,-1)
> 1000000 loops, best of 3: 496 ns per loop
%timeit range(10)[::-1]
> 1000000 loops, best of 3: 659 ns per loop
如果要使用范围,请这样做:
range(n, -1, -1)
正如其他人所示,它更快。
就个人而言,要向后循环,我更喜欢使用内置函数 reversed
,结合enumerate
:
for i, v in enumerate(reversed(mylist))
它更具可读性,并且您可以获得索引和值:)