37

可能重复:
仅需要索引:枚举或(x)范围?

其中哪一个会被认为更好/更清晰/更快/更“Pythonic”?我不关心列表的内容L,只关心它有多长。

a = [f(n) for n, _ in enumerate(L)]

或者

a = [f(n) for n in range(len(L))]

如果它有任何区别,该函数f也可以使用len(list)

4

4 回答 4

32

一些快速的计时运行似乎给第二个选项使用range()了轻微的优势enumerate()

timeit a = [f(n) for n, _ in enumerate(mlist)]
10000 loops, best of 3: 118 us per loop

timeit a = [f(n) for n in range(len(mlist))]
10000 loops, best of 3: 102 us per loop

只是为了好玩xrange()(Python v2.7.2)

timeit a = [f(n) for n in xrange(len(mlist))]
10000 loops, best of 3: 99 us per loop

我倾向于首先使用可读代码,然后使用xrange()(即 Pre-Python v 3.x),然后使用range()and enumerate()

于 2012-08-16T15:06:11.647 回答
7

(x)range 解决方案更快,因为它的开销更少,所以我会使用它。

在 Python 2.x 中,使用xrange而不是range,因为xrange使用较少的内存,因为它不会创建临时列表。在 Python 3.x 中,只有range,这是内存较少的版本。

因此,在 Python 2.x 中,迭代 a临时range(n)使用O(n)内存,而迭代 an 临时xrange(n)使用O(1)内存。两者的运行时间都是O(n)

于 2012-08-16T15:05:29.373 回答
4

我会说,由于您没有使用 enumerate 函数中的“_”属性,因此请使用 range,因为这样更具可读性。

于 2012-08-16T15:06:45.227 回答
2

假设您使用的是 Python 2.x,如果您使用len(),则应该使用xrange()它,因为它将避免创建范围内的数字列表。

在这种情况下,我会选择,len()因为您使用的是索引,而不是列表中的项目。

于 2012-08-16T15:07:00.820 回答