1

私は Sage (スクリプトで通常の Python 構文を使用できる Python で書かれたコンピュータ代数システム) で非常に単純な試行錯誤のコードをいくつか書きました。この小さなコード スニペットは、多項式を作成し、係数を使用していくつかの計算を行います。特に、係数の 3 つの式によって生成される理想の 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 に答える