python中的迭代消耗整个内存 - 错误的代码?

时间:2012-11-06 18:35:20

标签: python memory sage

我在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例程中的一些问题。我不知道。您能发现我的代码存在问题还是其他问题?

2 个答案:

答案 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的算法内部。