私はより大きなプログラムを書いていますが、3x3行列の行列式をできるだけ速く取得することは、それがうまく機能するために非常に重要です。numPyを使用してそれを実行できることを読みましたが、CompSciの3学期にいるので、自分でコードを書く方が教育的だと思いました。
そこで、2つの関数を作成し、time.clock()(win7マシンを使用)を使用して、各関数が値を返すのにかかる時間を計測します。
これが最初の関数です。
def dete(a):
x = (a[0][0] * a[1][1] * a[2][2]) + (a[1][0] * a[2][1] * a[3][2]) + (a[2][0] * a[3][1] * a[4][2])
y = (a[0][2] * a[1][1] * a[2][0]) + (a[1][2] * a[2][1] * a[3][0]) + (a[2][2] * a[3][1] * a[4][0])
return x - y
そしてこれは2番目の関数です:
def det(a):
a.append(a[0]); a.append(a[1]);
x = 0
for i in range(0, len(a)-2):
y=1;
for j in range(0, len(a)-2):
y *= a[i+j][j]
x += y
p = 0
for i in range(0, len(a)-2):
y=1;
z = 0;
for j in range(2, -1, -1):
y *= a[i+z][j]
z+=1
z += 1
p += y
return x - p
どちらも正しい答えを示していますが、最初の方が少し速いようです。これにより、forループの方が使いやすく、通常は高速であるため、間違ったことをしていると思います。ループが遅すぎて太くなりすぎたのです。 。トリミングしてみましたが、*=と+=の操作に時間がかかりすぎて多すぎるようです。numPyがこの問題をどれだけ速く処理するかはまだ確認していませんが、効率的なコードの記述を上手にしたいと思っています。それらのループをより速くする方法についてのアイデアはありますか?