提问人:nik_nul 提问时间:9/28/2023 最后编辑:nik_nul 更新时间:9/29/2023 访问量:55
当 Python 中的 Lambda 函数弯曲超过 1e5 次时,发生“分段错误”
'Segmentation Fault' occurred when Lambda Function in Python recurves over 1e5 times
问:
def count_cond(condition):
return lambda x:(((lambda f:(lambda a:f(a(a)))(lambda a:f(lambda *w:a(a)(*w))))(lambda cc: lambda j,m: ((cc(j+1,m+1) if condition(x,m)==True else cc(j,m+1))) if m<=x else j))(0,1))
# Returns a function with one parameter N that counts all the numbers from 1 to N that satisfy the two-argument predicate function Condition, where the first argument for Condition is N and the second argument is the number from 1 to N.
我实现了上面的功能,按照说明所说的那样做。它可能有点抽象,所以下面的例子可能有助于你理解我实际上在做什么。
>>> count_factors = count_cond(lambda n, i: n % i == 0)
>>> count_factors(12) # 1, 2, 3, 4, 6, 12
6
>>> count_factors(10000)
25
在小规模测试用例中,它运行良好。您可能会发现“超出最大递归深度”,然后您可以尝试以下几行进行快速修复,因为深度预计约为 2n。
import sys
sys.setrecursionlimit(10000000)
但是当涉及到更大的规模时,比如 1e6 或类似的东西(我的意思是),python 只会返回并崩溃,直接返回终端,如下图所示。分段故障图像count_factors(100000)
Segmentation Fault
但是,如果我将该 lambda 函数扩展为正常函数,如下所示,效率可能有点低,但它仍然运行良好,即使在 1e7 测试中(它是)。count_factors(1000000)
def cc(condition,x,j=0,m=1):
return ((cc(condition,x,j+1,m+1) if condition(x,m)==True else cc(condition,x,j,m+1))) if m<=x else j
我试图使用和python,但它们都没有提供任何有价值的东西。他们只是向程序展示了一次又一次地重复那行,直到出现故障。python faulthandler
gdb
如果这是python的错误或功能,或者我做错了什么,我徘徊,我该如何修复这个错误。
我将感谢您的慷慨帮助。
这个问题与这个问题不同,正如我使用的,如果我将这个 lambda 函数扩展为普通函数,它运行良好,与上面描述的问题不同。python 3.11
答: 暂无答案
评论