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 循环做了同样的事情,而且效果很好!我仍然不确定你的是如何工作的,而我的原件没有,所以我会尽快仔细看看以了解情况。
谢谢大家的帮助!
所以我一直在尝试制作一个完全符合道德目的的递归代码,我注意到 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 循环做了同样的事情,而且效果很好!我仍然不确定你的是如何工作的,而我的原件没有,所以我会尽快仔细看看以了解情况。 谢谢大家的帮助!