首页 > 解决方案 > Python 递归函数的限制(进程以退出代码 139 结束)

问题描述

我有一个旧脚本,它从 pandas 数据框中计算其他列的新列,但也从该列的先前结果计算。

这个脚本用于循环,而且速度很慢。出于这个原因,我用递归函数替换了 for 循环。

新脚本比旧脚本快大约 100 倍,这是个好消息。但我现在遇到了以前没有的限制。一旦我的数据集中有超过 29952 行,我就会收到以下错误:

“进程以退出代码 139 完成(被信号 11 中断:SIGSEGV)”

我用反映我的问题的列表制作了这个小脚本:

import random
import sys


def list_generator(min_value, max_value, list_lenght):
    return [random.randrange(min_value,max_value) for i in range(list_lenght)]


def recursive_function(list_1, list_2, n, result):
    if n == len(list_1):
        return result
    elif list_1[n] <= list_2[n]:
        result.append(1 + result[n - 1])
    else:
        result.append(0)
    return recursive_function(list_1, list_2, (n + 1), result)


list_lenght = 29952  # How to increase this limit without generating an error?

min_value = 10
max_value = 20

list_one = list_generator(min_value, max_value, list_lenght)
list_two = list_generator(min_value, max_value, list_lenght)

# Set recursion limit
sys.setrecursionlimit(list_lenght * 2)

# Compute a new list from list_one and list_two
list_result = recursive_function(list_one, list_two, 1, [0])

我怀疑是内存问题,但是如何在尽可能避免这个限制的同时利用 python 递归函数的所有功能呢?

提前致谢


根据@trincot 的评论,这里是没有递归函数的代码版本......它最终比上面带有递归函数的版本更快!没有更多的限制

def no_recursive_function(list_1, list_2, n, result):
    if list_1[n] <= list_2[n]:
        return 1 + result[n - 1]
    else:
        return 0
    
    
list_lenght = 29952
min_value = 10
max_value = 20

list_one = list_generator(min_value, max_value, list_lenght)
list_two = list_generator(min_value, max_value, list_lenght)

# Set recursion limit
sys.setrecursionlimit(list_lenght * 2)

list_result_2 = [0]
for n in range(list_lenght - 1):
    result = no_recursive_function(list_one, list_two, n + 1, list_result_2)
    list_result_2.append(result)

标签: python-3.xalgorithmrecursionmemory

解决方案


推荐阅读