gpt4 book ai didi

python - 有没有办法避免这种内存错误?

转载 作者:IT王子 更新时间:2023-10-28 23:33:31 26 4
gpt4 key购买 nike

我目前正在解决 Project Euler 上的问题,到目前为止,我已经想出了这个代码来解决问题。

from itertools import combinations
import time

def findanums(n):
l = []
for i in range(1, n + 1):
s = []
for j in range(1, i):
if i % j == 0:
s.append(j)
if sum(s) > i:
l.append(i)
return l

start = time.time() #start time

limit = 28123

anums = findanums(limit + 1) #abundant numbers (1..limit)
print "done finding abundants", time.time() - start

pairs = combinations(anums, 2)
print "done finding combinations", time.time() - start

sums = map(lambda x: x[0]+x[1], pairs)
print "done finding all possible sums", time.time() - start

print "start main loop"
answer = 0
for i in range(1,limit+1):
if i not in sums:
answer += i
print "ANSWER:",answer

当我运行它时,我遇到了 MemoryError

回溯:

File "test.py", line 20, in <module>
sums = map(lambda x: x[0]+x[1], pairs)

我试图通过禁用垃圾收集来阻止它,我已经能够从 Google 获得但无济于事。我是以错误的方式接近这个吗?在我看来,这是最自然的方式,但我现在不知所措。

旁注:我使用的是 PyPy 2.0 Beta2(Python 2.7.4),因为它比我使用过的任何其他 python 实现都快得多,而且 Scipy/Numpy 已经超出了我的想象,因为我才刚刚开始编程,我没有工程或强大的数学背景。

最佳答案

正如 Kevin 在评论中提到的,您的算法可能是错误的,但无论如何您的代码并未优化。

当使用非常大的列表时,通常使用 generators,Stackoverflow 有一个著名的很棒的答案,解释了 yieldgenerator - What does the "yield" keyword do in Python?

问题是您的 pairs = combination(anums, 2) 不会生成 generator,而是生成一个消耗更多内存的大对象。

我将您的代码更改为具有此功能,因为您只对集合进行了一次迭代,您可以懒惰地评估这些值:

def generator_sol(anums1, s):
for comb in itertools.combinations(anums1, s):
yield comb

现在代替 pairs = combination(anums, 2) 生成一个大对象。使用:

pairs = generator_sol(anums, 2)

然后,我将使用另一个 generator,而不是使用 lambda:

sums_sol = (x[0]+x[1] for x in pairs)

另一个提示,你最好看看 xrange哪个更合适,它不会生成一个列表,而是一个 xrange 对象,这在许多情况下(例如这里)更有效。

关于python - 有没有办法避免这种内存错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16091781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com