我在 Sage(一个用 python 编写的计算机代数系统,您可以在脚本中使用常规 python 语法)中编写了一些非常简单的试错代码。这个小代码片段创建了一个多项式并用系数做了一些计算,特别是它确定了系数中三个表达式生成的理想的 Groebner 基。
问题是:这个程序继续运行并耗尽我所有的内存,直到它被内核杀死。每次迭代仅消耗大约 200kB,但此内存永远不会再次释放。
这是代码。细节不是那么重要而且非常庞大,因此省略:
R = PolynomialRing(QQ, 2, 'bc', order='lex')
expr1, expr2, expr3 = ...
for i in range (0,50):
for j in range(i+1,50):
for k in range(j+1,50):
for l in range(k+1,50):
for m in range(l+1,50):
for n in range(m+1,50):
poly = (x-i)*(x-j)*(x-k)*(x-l)*(x-m)*(x-n)
r = poly.coeffs()
p1 = expr1.substitute(r...)
p2 = expr2.substitute(r...)
p3 = expr3.substitute(r...)
I = (p1, p2, p3)*R
B = I.groebner_basis()
据我了解 python 的内存管理,循环体中的变量每隔一段时间就会被释放。现在,它可能是编程问题、内部 python 问题或 Sage 例程中的某些问题。我不知道。您能发现我的代码有问题还是其他问题?
最佳答案
问题似乎不是你的循环(在 python2.7、OS-X 10.5.8 中):
a = 0
for i in range (0,50):
for j in range(i+1,50):
for k in range(j+1,50):
for l in range(k+1,50):
for m in range(l+1,50):
for n in range(m+1,50):
a += 1
print( a )
这在 python2.x 和 python3.x 上只需要很少的额外内存。
而且运行起来真的不需要那么长时间:
time python test.py
15890700
real 0m6.015s
user 0m5.940s
sys 0m0.032s
也许在使用 sage
运行时有些奇怪?或者可能是您循环中的其他原因导致了问题...
关于python - python 中的迭代会消耗整个内存 - 错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13257179/