繁体   English   中英

Python 3中的循环,列表推导和映射的性能

[英]Performance of loops, list comprehensions and maps in Python 3

如何才能在Python 3.6中正确比较for循环,列表推导和映射的性能?

在下面的代码中,普通的旧for循环执行得很好(我使用list()从生成器获取值)。 我在这里做错了吗? 结果与Python 2讨论形成鲜明对比。

import timeit

code_for = """
for i in range(1000):
    hex(i)
"""

code_map = """
list(map(hex, range(1000)))
"""

code_map_lambda = """
list(map(lambda x: hex(x), range(1000)))
"""

code_list_comprehension = """
[hex(x) for x in range(1000)]
"""

print(timeit.timeit(code_for, number=10000))
# 1.1155821208376437

print(timeit.timeit(code_map, number=10000))
# 0.8820606248918921

print(timeit.timeit(code_map_lambda, number=10000))
# 1.7510833400301635

print(timeit.timeit(code_list_comprehension, number=10000))
# 1.1798800542019308

更新:在code_for向列表添加元素

code_for_2 = """
a = [0] * 1000
for i in range(1000):
    a[i] = hex(i)
"""
# 1.243549756007269

code_for_3 = """
a = []
for i in range(1000):
    a.append(hex(i))
"""
# 1.5462996119167656    

几点建议:

  1. 为清晰起见,将代码包含在函数中。
  2. 您缺少列表创建并附加在code_for 这是使用显式for循环的大部分成本。
  3. 然后你可以使用timeit ,或者如果你有Jupyter笔记本,可以使用magic %timeit命令。

如下所示,没有lambda map表现最好,这是有道理的,因为hex是内置的。 请参阅Python列表理解VS. 地图了解更多详情。

def code_for(n):
    res = []
    for i in range(n):
        res.append(hex(i))
    return res

def code_map(n):
    return list(map(hex, range(n)))

def code_map_lambda(n):
    return list(map(lambda x: hex(x), range(n)))

def code_list_comprehension(n):
    return [hex(x) for x in range(n)]

%timeit code_for(10000)                 # 3.19 ms per loop
%timeit code_map(10000)                 # 1.69 ms per loop
%timeit code_map_lambda(10000)          # 3.06 ms per loop
%timeit code_list_comprehension(10000)  # 2.27 ms per loop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM