8

[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]
4

5 回答 5

11
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),然后反转列表,这就是为什么需要更多时间的原因。

于 2013-11-07T15:11:50.623 回答
3

如果您的数字列表可能很大,或者您实际上并不需要该列表,而只是在该范围内进行迭代,则可以通过使用来避免实际创建列表

xrange(N, -1, -1)

正如 Rob 在下面的评论中提到的,这种行为是 Python 3 下的新默认行为(返回生成器而不是实际列表),但对于 Python 2,您可以range()返回一个列表并xrange()返回一个生成器。

于 2013-11-07T15:12:13.803 回答
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)

于 2013-11-07T15:12:28.853 回答
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
于 2013-11-07T15:12:39.543 回答
0

如果要使用范围,请这样做:

range(n, -1, -1)

正如其他人所示,它更快。

就个人而言,要向后循环,我更喜欢使用内置函数 reversed,结合enumerate

for i, v in enumerate(reversed(mylist))

它更具可读性,并且您可以获得索引和值:)

于 2013-11-07T15:10:10.160 回答