Python - 获取数字N到0的列表

时间:2013-11-07 15:07:30

标签: python

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

5 个答案:

答案 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