Python 3 中循环、列表理解和映射的性能
Performance of loops, list comprehensions and maps in Python 3
如何正确比较 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
一些提示:
- 为了清晰起见,将您的代码包装在函数中。
- 您在
code_for
中缺少列表创建和追加。这是使用显式 for
循环的大部分成本。
- 然后您可以使用
timeit
,或者如果您有 Jupyter notebook,则可以使用神奇的 %timeit
命令。
如下所示,没有 lambda
的 map
表现最好,这是有道理的,因为 hex
是内置的。有关详细信息,请参阅 Python List Comprehension Vs. Map。
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
如何正确比较 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
一些提示:
- 为了清晰起见,将您的代码包装在函数中。
- 您在
code_for
中缺少列表创建和追加。这是使用显式for
循环的大部分成本。 - 然后您可以使用
timeit
,或者如果您有 Jupyter notebook,则可以使用神奇的%timeit
命令。
如下所示,没有 lambda
的 map
表现最好,这是有道理的,因为 hex
是内置的。有关详细信息,请参阅 Python List Comprehension Vs. Map。
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