【发布时间】:2012-02-26 17:25:01
【问题描述】:
我正在编写一个更大的程序,并且尽可能快地获得 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和分析器来准确地显示速度有多快。 -
所以 for 循环通常比简单的展开直接计算更快?嗯...看来我真的需要学习很多关于 Python 的东西 ;)
-
如果你想计算一个 3x3 行列式,没有什么比你的第一个函数中的这个优化公式更优雅了。
标签: python performance matrix determinants