Python 是否在 min() 等内置函数中实现短路?

Does Python implement short-circuiting in built-in functions such as min()?

提问人:Clem 提问时间:5/13/2022 最后编辑:Clem 更新时间:5/13/2022 访问量:37

问:

Python 3 是否尽可能在内置函数中实现短路,就像它对布尔语句所做的那样?

举个具体的例子,下面这段代码:

min((20,11), key = lambda x : x % 10) # 20

Python 是否事先评估作为参数传递的函数的最小可能值为 0,因此在计算可迭代传递 (20) 中的第一个整数后立即停止,因为 20 % 10 等于 0? 还是在返回答案之前,它是否必须评估可迭代对象中的所有元素?

我想短路甚至并不总是可能的,特别是对于更复杂的函数,但是对于众所周知的内置函数或像 % 这样的运算符呢?

我在官方文档中找不到答案。

谢谢

python-3.x 函数 boolean-logic 内置

评论

0赞 Pankaj 5/13/2022
您可以通过查看其实现方式来自己检查它。在 - github.com/python/cpython/blob/main/Python/bltinmodule.c 检查min_max功能

答:

1赞 Germán Martinez 5/13/2022 #1

Python 必须计算可迭代对象中的所有值,因为语言会逐个元素计算,如果您的元组中有不是数字的东西,它将在尝试执行 % 操作时触发异常。Python 无法猜测列表中的内容。您可以通过定义一个函数而不是 lambda 并在其中设置调试点来测试这一点。

def my_mod(x): 
    import ipdb; ipdb.set_trace() 
    return x % 20 

然后调用函数

min((20,11), key = my_mod)

你可以做一个快速的错误测试用例

min((20,11, "s"), key = my_mod)

它将触发异常,但首先必须评估列表中的所有先前元素。