我在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例程中的一些问题。我不知道。您能发现我的代码存在问题还是其他问题?
答案 0 :(得分:4)
问题似乎不是你的循环(在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
一起运行时,或许某些东西很时髦?或者也许你的循环中的其他东西导致了问题......
答案 1 :(得分:0)
错误的起源可能是多元多项式的调用方法。像无辜的东西:
` for i in xrange(really_big_number):
polynomial(1,0,0,0)==0 `
会爆炸。
这可能发生在p1 = expr1.substitute(r...)
或者在Groebner Basis的算法内部。