为什么“enumerate”比“xrange + lst[i]”慢?
>>> from timeit import Timer
>>> lst = [1,2,3,0,1,2]*1000
>>> setup = 'from __main__ import lst'
>>> s1 = """
for i in range(len(lst)):
elem = lst[i]
"""
>>> s2 = """
for i in xrange(len(lst)):
elem = lst[i]
"""
>>> s3 = """
for i, v in enumerate(lst):
elem = v
"""
>>> t1 = Timer(s1, setup); t2 = Timer(s2, setup); t3 = Timer(s3, setup)
>>> t1.timeit(3000), t2.timeit(3000), t3.timeit(3000)
(1.9263118636586494, 1.6119261665937992, 1.9606022553145719)
>>> t1.timeit(3000), t2.timeit(3000), t3.timeit(3000)
(1.93520258859715, 1.6145745478824836, 1.9529405971988041)
EDIT: I keep in mind why
for i, v in enumerate(lst):
elem = i, v
比 for i in xrange(len(lst)):
elem = i, lst[i]
慢
最佳答案
如果你测量得当,你会发现本质上没有区别(在这个例子中枚举在微观上比 xrange 快,但在噪声范围内):
$ python -mtimeit -s'lst=[1,2,3,0,1,2]*1000' 'for i in xrange(len(lst)): elem=lst[i]'
1000 loops, best of 3: 480 usec per loop
$ python -mtimeit -s'lst=[1,2,3,0,1,2]*1000' 'for i, elem in enumerate(lst): pass'
1000 loops, best of 3: 473 usec per loop
(顺便说一句,我总是建议像这样在 shell 提示符下使用 timeit
,而不是在代码内或在解释器提示符下使用,因为输出格式非常好且可用,有时间和一切的度量单位)。
在您的代码中,您在枚举情况下有一个额外的分配:您在 for
header 子句中将列表项分配给 v,然后再次将 v
分配给 元素
;而在 xrange 的情况下,您只将项目分配给 elem
一次。当然,在我的情况下,我也只分配一次;你为什么要分配多次呢?!无论您在循环主体中使用 elem
和 i
做什么,您都可以用我正在测量的两种形式进行相同的操作,只是没有您枚举的冗余案例有。
关于python - 为什么 Python 的枚举这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352497/