Python中map为何比列表推导式略快?
map(int, numpy数组)为何比列表推导式更快? 测试场景
In [1]: import numpy as np In [2]: a1 = np.random.rand(100000)*31 In [3]: %%timeit ...: a2 = [int(a) for a in a1] 12.3 ms ± 156 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [4]: %%timeit ...: a2 = list(map(int, a1)) 9.58 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
测试结果显示list(map(int, a1))的执行速度略快于列表推导式,以下是具体分析:
性能差异的原因
- 底层实现差异:
map是CPython内置的纯C实现工具,它直接将目标函数(此处为int)和可迭代对象传递给底层C逻辑处理,全程无需在Python解释器层面反复执行循环体的变量绑定、表达式求值操作。 - 解释器开销减少:列表推导式本质是Python层面的循环结构,每一次迭代都要触发Python解释器对
int(a)表达式的解析、求值,这会产生额外的解释器调用开销;而map直接在C层完成函数调用,避免了这部分累积损耗。 - 迭代协议适配:对于numpy数组这类实现了迭代器协议的对象,
map的C实现能更直接地调用其迭代接口,减少了Python层面对迭代过程的封装开销。
是否属于预期情况
这完全是预期现象。在处理单一函数映射的简单迭代场景时,map因更低的解释器开销,通常会比列表推导式有轻微的性能优势;当迭代规模越大,这种差异会越明显。但如果迭代逻辑涉及复杂的多步骤表达式,列表推导式的可读性和性能表现会更均衡,甚至可能反超。
深入了解的资料方向
- 阅读Python官方文档中
map函数和列表推导式的章节,明确两者的设计定位与执行逻辑。 - 研究CPython源码中
map的C实现(如Objects/mapobject.c)和列表推导式的编译过程,直观理解底层执行的差异。 - 学习Python迭代器协议、函数调用的底层机制,掌握纯C实现与Python层面执行的开销区别。
内容的提问来源于stack exchange,提问作者Chiffa
相关产品推荐
相关产品推荐

