python - 为什么 Python 的枚举这么慢?

标签 python

为什么“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 一次。当然,在我的情况下,我也只分配一次;你为什么要分配多次呢?!无论您在循环主体中使用 elemi 做什么,您都可以用我正在测量的两种形式进行相同的操作,只是没有您枚举的冗余案例有。

关于python - 为什么 Python 的枚举这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352497/

相关文章:

python - 将有序元组列表保存为 CSV

python - 请求.exceptions.SSLError : [Errno 2] No such file or directory

python - 如何使用 px.bar() 在堆积条形图中显示百分比值?

python - 尝试使用 pip 在 python 中安装新模块时,cmd 正在搜索错误的文件路径

python - Django ajax上传图片

python - 在 vim 中高亮显示 python 代码块

python - LSTM RNN 预测的反向缩放输出错误

python - 无法覆盖 flask_bootstrap css

python - 如何将单个 pandas.DataFrame 行拆分为多个由空格分隔的列? Python

python - 从 python 3.x 中的文件读取标记