gpt4 book ai didi

python - Python是否优化lambda x : x

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:57 25 4
gpt4 key购买 nike

So I wrote some code for a max/min that assumes a bottleneck on generating the data (否则我只使用 maxmin),它需要一个关键函数,如果没有给出,则使用恒等函数:

if key is None:
key = lambda x: x

然后是:

for i in iterable:
key_i = key(i)

由于瓶颈在生成器上,这个问题可能没有实际意义,但如果没有 key ,我会为每个项目调用 lambda x: x我假设 Python 可以优化这个身份函数。有人可以告诉我它是否有效吗? 如果没有,它的价格是多少?有没有办法在不加倍行数的情况下更好地做到这一点(例如三元运算符)?

最佳答案

好问题!优化器可以看到 foo 在某些可预测的条件下可能是一个身份函数,并创建一个替代路径来用它的已知结果替换它的调用

让我们看看操作码:

>>> def foo(n):
... f = lambda x:x
... return f(n)
...
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_CONST 1 (<code object <lambda> at 0x7f177ade7608, file "<stdin>", line 2>)
3 MAKE_FUNCTION 0
6 STORE_FAST 1 (f)

3 9 LOAD_FAST 1 (f)
12 LOAD_FAST 0 (n)
15 CALL_FUNCTION 1
18 RETURN_VALUE

CPython(2.7 和 3.3 测试)似乎没有优化 lambda 调用。也许另一个实现可以?

>>> dis.dis(lambda x:x)
1 0 LOAD_FAST 0 (x)
3 RETURN_VALUE

恒等函数作用不大。因此,您基本上有 2 个 LOAD_FAST、1 个 CALL_FUNCTION 和 1 个 RETURN_VALUE 可以在每次调用身份函数时进行优化,而不是创建可靠的替代路径(这可能比解释器看起来更复杂,如@viraptor 所说)。

也许 python 代码中的 else 路径会更好。

您对最小/最大示例所做的真正优化是通过存储结果来减少函数的调用次数。它现在被调用了 n 次而不是 n*4,这是一个公平的收获!

关于python - Python是否优化lambda x : x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22290675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com