Я пишу большую программу, и получение определителей матриц 3x3 как можно быстрее очень важно для ее хорошей работы. Я читал, что могу использовать numPy для этого, но я подумал, что, возможно, написание собственного кода будет более образовательным, поскольку я нахожусь на третьем семестре CompSci.
Итак, я написал две функции и использую 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
А это вторая функция:
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 решает эту проблему, но я хочу лучше писать эффективный код. Любые идеи о том, как сделать эти циклы быстрее?
timeit
и профилировщик, чтобы показать, точно насколько быстрее. - person S.Lott   schedule 26.02.2012