1

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

4

2 回答 2

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?或者,也许是循环中的其他东西导致了问题......

于 2012-11-06T18:52:06.823 回答
0

该错误的根源可能是多元多项式的调用方法。像这样无辜的东西:

` for i in xrange(really_big_number):
    polynomial(1,0,0,0)==0 `

会爆炸。

这可能发生在 p1 = expr1.substitute(r...)Groebner 基础的算法中或内部。

于 2014-05-24T17:32:09.767 回答