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

时间:2018-06-25 11:28:14

标签: python python-3.x performance benchmarking

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

在下面的代码中,普通的for循环执行得很好(我使用list()从生成器获取值)。我在这里做错什么了吗?结果与discussion on 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 个答案:

答案 0 :(得分:3)

一些指针:

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

如下所示,没有map的{​​{1}}表现最佳,这是有道理的,因为lambda是内置的。有关更多详细信息,请参见Python List Comprehension Vs. Map

hex