在python中获取列表[N, N-1, ..., 0]
的最佳方法是什么?我有两种方法
>>> 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]
答案 0 :(得分:9)
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)
完全相同的操作,然后反转列表,这就是为什么需要更多时间。
答案 1 :(得分:2)
如果您的数字列表可能很大,或者您实际上并不需要列表,但只是要迭代该范围,您可以避免使用
实际创建列表xrange(N, -1, -1)
正如Rob在下面的评论中提到的,这种行为是Python 3下的新默认行为(返回生成器而不是实际列表),但对于Python 2,您有range()
返回列表并{ {1}}返回生成器。
答案 2 :(得分:1)
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)
答案 3 :(得分:0)
如果你想使用范围,可以这样做:
range(n, -1, -1)
正如其他人所示,它更快。
就个人而言,要向后循环,我更喜欢使用内置函数reversed
,并结合enumerate
:
for i, v in enumerate(reversed(mylist))
它更具可读性,你同时得到索引和值:)
答案 4 :(得分:0)
你的第二种方法更快:
%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