python-3.x - Python 递归函数的限制(进程以退出代码 139 结束)
问题描述
我有一个旧脚本,它从 pandas 数据框中计算其他列的新列,但也从该列的先前结果计算。
这个脚本用于循环,而且速度很慢。出于这个原因,我用递归函数替换了 for 循环。
新脚本比旧脚本快大约 100 倍,这是个好消息。但我现在遇到了以前没有的限制。一旦我的数据集中有超过 29952 行,我就会收到以下错误:
“进程以退出代码 139 完成(被信号 11 中断:SIGSEGV)”
我用反映我的问题的列表制作了这个小脚本:
- 如果我将列表 (list_lenght) 的大小增加到 29952 以上,脚本会崩溃(在我的计算机上)
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)
解决方案
推荐阅读
- solidity - 我收到一个错误,一个声明错误,但它指向我不明白的引号中的内容
- cypress - cypress 测试套件是否有办法在其输出中取消屏蔽敏感信息以进行调试?
- powerbi - 根据用户动态更改 power bi 嵌入式报表
- android - 如何在 Jetpack Compose Text 中居中(水平和垂直)文本
- python - 如何根据另一列的值计数从 Pandas Dataframe 中采样数据
- python - PyGame 在第二个屏幕上正常,但在笔记本电脑屏幕上显示黑屏
- python - 在数据框列中分离出逗号分隔的项目并获取单独的计数
- python - 尝试从网站实时抓取文章时,我总是遇到延迟
- javascript - 如何通过JS为html元素创建升序号?
- amazon-web-services - 安全组 aws 特定 ip http/https 阻止一切