gpt4 book ai didi

python - 3x3 矩阵行列式函数 - 使其更快

转载 作者:行者123 更新时间:2023-12-02 06:41:51 24 4
gpt4 key购买 nike

我正在编写一个更大的程序,尽可能快地获取 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 处理这个问题的速度有多快,但我想更好地编写高效的代码。关于如何使这些循环更快有什么想法吗?

最佳答案

循环更优雅、更通用,但它们并不比单个表达式中的几个内联乘法“通常更快”。

首先,Python 中的 for 循环必须在您将进行交互的对象上组装对象(对 range 的调用),然后在该迭代器上调用方法对于循环中的每个项目。

所以,根据你在做什么,如果内联表单足够快,你可以保留它 - 如果它仍然太慢(当我们在Python中进行数值计算时通常是这种情况),你应该使用数字库(例如 NumpY),可以在 native 代码中计算行列式。对于这样的数字操作代码,您可以使用 native 代码将其运行速度提高数百倍。

如果 yo9u 需要一些现有库无法执行的数值计算,如果您追求速度(例如,图像处理中的像素操作),您可能更喜欢编写一个在 native 代码中运行的扩展(使用 C、Cython 或其他一些东西)以获得更快的速度。

另一方面,如果速度并不重要,并且您甚至注意到内联表达式只是“稍微快一点”,则只需使用完整循环 - 您将获得更具可读性和可维护性的代码 - 这是使用 Python 的主要原因毕竟。

在您给出的具体示例中,您可以通过将“范围”调用硬编码到元组来提高循环代码的速度 - 例如,更改:for i in range(0, len(a)-2):for i in (0, 1, 2) - 请注意,在内联情况下,您失去处理不同大小矩阵的能力。

关于python - 3x3 矩阵行列式函数 - 使其更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com