Python shell 打印4788行后重启

Python shell restarts after printing 4788 lines

所以我一直在尝试制作一个完全符合道德目的的递归代码,我注意到 python shell 会在大约 30 秒后重新启动。

一开始我以为是内存泄漏引起的栈溢出,所以才妥善处理;仍然没有运气。 然后我使用 tracemalloc 查看我的内存使用情况,发现在重新启动之前它只达到了大约 1.3 MB。我尝试了很多方法来阻止内存泄漏,所有这些方法都给出了不同的最终内存大小,但仍在重新启动。

这是我注意到的时候,无论使用的总内存量如何,每次打印 4788 行后都会重新启动。

有没有限制可以打印多少行python之类的?请帮助!

import random
import sys
import gc
import tracemalloc

tracemalloc.start()

def cleartrash():
    #gc.collect()

##    del genphrase

    print('clearedddddddddddddddddddddddddd')

sys.setrecursionlimit(99999999)
capitalsandlowers = ('qwertyuiopasdfghjklzxcvbnm')

print ('monkey experiment')
def generatephrase():
    generatedlength = random.randint(5,5)
    genphrase = ( ''.join(random.choice(capitalsandlowers) for i in range(generatedlength)) )
    
    print(genphrase)
    
    if genphrase == 'henry':
        print('done',genphrase)
    else:
        current, peak = tracemalloc.get_traced_memory()
        print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")

        #cleartrash()
        del genphrase
        del generatedlength
        #gc.collect()
        generatephrase()

generatephrase()
tracemalloc.stop()

很抱歉必须包含我的全部代码,但我根本不知道在哪里或如何去修复/问题出在哪里。

提前致谢!

这不是递归的有效使用,因为问题本身不是递归的。如果我们将代码更改为迭代,它 运行 无限期地位于固定数量的内存中:

from random import randint, choices
from string import ascii_lowercase as capitalsandlowers

print("Monkey Experiment")

def generatephrase():
    while True:
        generatedlength = randint(5, 5)
        genphrase = ''.join(choices(capitalsandlowers, k=generatedlength))

        print(genphrase)

        if genphrase == 'henry':
            print("Done:", genphrase)
            break

generatephrase()

在我的测试中 运行,它在四分钟内找到了目标短语:

Done: henry
193.963u 28.280s 3:53.61 95.1%  0+0k 0+0io 0pf+0w

已测试 9,356,241 个随机字符串。

自从我旅行以来我就没有使用过 WiFi,但我设法在飞机上玩了一些,并使用 while 循环做了同样的事情,而且效果很好!我仍然不确定你的是如何工作的,而我的原件没有,所以我会尽快仔细看看以了解情况。 谢谢大家的帮助!