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

标签 python performance matrix determinants

我正在编写一个更大的程序,尽可能快地获取 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/

相关文章:

r - 将向量转换为 data.frame,每个唯一值对应一列

python - 如何将一系列列表转换为python中的数据框?

python - 使用 pandas 创建多个表

python - PyMongo 插入具有约 100M 记录的极其缓慢的数据库

performance - 如何在CockroachDB中构建 Multi-Tenancy 系统以保证良好的性能?

javascript - Windows Defender 减慢 Electron 启动速度

php - 使用循环 PHP、对角线检查增加 IF 语句中的条件

python - 尝试通过python创建快捷方式

javascript - Electron - 一致的性能和启动子 Node.js 进程

r - 保持矩阵中对角线上的最大值