python - map 与生成器表达式的性能
问题描述
我正在做一个 Python 练习来查找两个值之间的所有偶数。我想出了以下结果
','.join(str(i) for i in range(1000, 3000+1) if i % 2 == 0)
但后来我注意到它比使用map
In [105]: %timeit ','.join(str(i) for i in range(1000, 3000+1) if i % 2 == 0)
1000 loops, best of 3: 412 µs per loop
In [107]: %timeit ','.join(map(str, (i for i in range(1000, 3000+1) if i % 2 == 0)))
1000 loops, best of 3: 374 µs per loop
研究这个,我遇到了这个答案,它解释了在使用生成器表达式时join
将生成器表达式转换为列表意味着生成器的通常好处(较小的内存占用和短路的可能性)不适用于 str.join,因此生成器具有的(小)额外开销使其性能更差。
这向我表明,将 amap
转换为 alist
比将生成器转换为更快
In [109]: %timeit list(map(str, (i for i in range(1000, 3000+1) if i % 2 == 0)))
1000 loops, best of 3: 366 µs per loop
In [110]: %timeit list(str(i) for i in range(1000, 3000+1) if i % 2 == 0)
1000 loops, best of 3: 399 µs per loop
为什么会这样?
解决方案
推荐阅读
- typescript - 忽略对打字稿装饰器的覆盖
- powerbi - 如何根据使用 power bi DAX 公式提交的日期中的数字分配 1 st、2 nd、3 rd 等?
- python - 我想将 urdu 抓取数据保存到 csv 文件中,但是当我打开文件时,文件格式不可读
- angular - daterangepicker.component.d.ts:错误无法在环境上下文中声明访问器
- vue.js - 带有子项的 Vuejs 侧边栏菜单
- ios - 使用会话管理器时如何查看访问令牌?
- google-colaboratory - 无法使用 colaboratory 在 mmdetection 中编译 nms_cuda
- bash - 如果登录多个终端,如何检查特定用户的最低空闲时间?
- java - 如何建立连接并且在经过一段时间后不关闭它
- php - MySQL 服务器已消失 #2006 - Azure 服务器和使用 PHP