为什么列表理解中的 lambda 函数比 map 中的慢?

use*_*964 4 python lambda

我做了一个测试

%timeit list(map(lambda x:x,range(100000)))
%timeit [(lambda x:x)(i) for i in range(100000)]
Run Code Online (Sandbox Code Playgroud)

29 ms ± 4.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
51.2 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)

为什么python lambda函数在列表理解中比在map中慢?

Ev.*_*nis 6

因为在您的第一个代码片段中,lambda它只创建一次并执行 100000 次,而在第二个代码片段中,它在每次迭代中创建和执行。

老实说,我很惊讶差异并没有更大,但是你的两个时间应该增长得更远,迭代的长度最大。


作为旁注,请注意,即使您将 更改为lambda不必首先创建而只需查找的内置函数,您仍然会得到相同的趋势:

> py -m timeit "list(map(float, range(10000)))"
200 loops, best of 5: 1.78 msec per loop

> py -m timeit "[float(x) for x in range(10000)]"
100 loops, best of 5: 2.35 msec per loop
Run Code Online (Sandbox Code Playgroud)

可以通过将函数绑定到变量来实现改进,但该list(map())方案仍然更快。

> py -m timeit "r=float;[r(x) for x in range(10000)]"
100 loops, best of 5: 1.93 msec per loop
Run Code Online (Sandbox Code Playgroud)

至于为什么绑定到局部变量更快,你可以在这里找到更多信息。

  • 你能澄清一下最后一段吗?出于完全相同的原因,使用“float”速度较慢——即“list(map())”与“list-compression”构建一次表达式与每次构建表达式相比。只是差别要小得多,因为构建“lambda”比查找“builtin”要昂贵得多。 (2认同)