1

英語が下手で申し訳ありません。私は現在 Python を使用していますが、10000x10000 のマトリックス サイズを埋めるのが遅すぎるという問題があります。異なるサイズのマトリックスをテストする必要がある「緩和方法」をプログラムします。それについては?... PS 10000x10000 の 1 つのマトリックスを埋めるのに 3 ~ 5 分待ちます。

    def CalcMatrix(self):
    for i in range(0, self._n + 1):                       #(0,10000)
        for j in range(0, self._n + 1):                   #(0,10000)
                one = sin(pi * self._x[i])                # x is the vector of size 10000
                two = sin(pi * self._y[j])                # y too
                self._f[i][j] = 2 * pi * pi * one * two   #fill 
4

2 に答える 2

1

ネイティブの Python ループ速度は非常に遅いです。Python で配列と行列を扱う人は、通常numpy. cython や numba など、特定の状況で速度を劇的に改善できるツールは他にもありますが、基本的な考え方はnumpy、操作をベクトル化し、ハードワークを C や fortran で実装された高速ライブラリに押し下げることです。

次のコードは、あまり高速ではないノートブックで数秒しかかかりません。

import numpy as np
from numpy import pi
x = np.linspace(0,1,10**4)
y = np.linspace(2,5,10**4)
ans = 2*pi**2 * np.outer(np.sin(pi*x), np.sin(pi*y))

(PS: の場合、_n == 10000マトリックスは 10000x10000 ではなく 10001x10001 になりませんか?)

于 2013-11-09T13:22:31.553 に答える
0

いくつかの改善が可能です。一部の計算をループの外に移動することを検討してください

def CalcMatrix(self):
for i in range(0, self._n + 1):                       #(0,10000)
    one = sin(pi * self._x[i])                # x is the vector of size 10000
    for j in range(0, self._n + 1):                   #(0,10000)
            two = sin(pi * self._y[j])                # y too
            self._f[i][j] = 2 * pi * pi * one * two   #fill 

この値2 * pi * pi は事前に計算して変数に格納できるため、ループのたびに再計算する必要はありません。

それでも不十分な場合は、C や Fortran などのネイティブ言語の使用を検討してください。

于 2013-11-09T13:06:58.573 に答える