可能重复:
仅需要索引:枚举或(x)范围?
其中哪一个会被认为更好/更清晰/更快/更“Pythonic”?我不关心列表的内容L
,只关心它有多长。
a = [f(n) for n, _ in enumerate(L)]
或者
a = [f(n) for n in range(len(L))]
如果它有任何区别,该函数f
也可以使用len(list)
。
可能重复:
仅需要索引:枚举或(x)范围?
其中哪一个会被认为更好/更清晰/更快/更“Pythonic”?我不关心列表的内容L
,只关心它有多长。
a = [f(n) for n, _ in enumerate(L)]
或者
a = [f(n) for n in range(len(L))]
如果它有任何区别,该函数f
也可以使用len(list)
。
一些快速的计时运行似乎给第二个选项使用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()
。
(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)。
我会说,由于您没有使用 enumerate 函数中的“_”属性,因此请使用 range,因为这样更具可读性。
假设您使用的是 Python 2.x,如果您使用len()
,则应该使用xrange()
它,因为它将避免创建范围内的数字列表。
在这种情况下,我会选择,len()
因为您使用的是索引,而不是列表中的项目。