首页 > 解决方案 > 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

为什么会这样?

标签: pythonpython-3.xperformancegeneratormap-function

解决方案


推荐阅读