地图与生成器表达式的性能

时间:2018-09-20 06:18:12

标签: python python-3.x performance generator map-function

我正在做一个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

对此进行了研究,我遇到了this answer,它说明了在join中使用生成器表达式时

  

将生成器表达式转换为列表意味着生成器的常规好处(较小的内存占用量和发生短路的可能性)不适用于str.join,因此(较小的)额外开销发电机使其性能变差。

这对我来说建议将map投射到list比铸造发电机要快

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

为什么会这样?

0 个答案:

没有答案