如何使用多个变量赋值加速python代码

2024-10-06 09:09:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写下面的一段代码,它创建一个numpy数组,并使用许多变量赋值来实现这一点。代码是由Maple优化生成的,这导致了大量变量赋值。该代码是由非常复杂的数学计算结果生成的,使用Maple无法进一步简化

    from math import sin, cos
    import numpy as np

    def __calc_tau(self, q, s_dot_v, omega_dot_ref, f_th, qm_ddot_ref):
        SC_param_est = self.SC_param_est
        SC_param = self.SC_param

        t1 = SC_param[3] + SC_param_est[0] + SC_param[10] + SC_param[9] + SC_param[8]
        t2 = cos(q[9])
        t3 = sin(q[9])
        t4 = SC_param[38] - SC_param[41]
        t5 = SC_param[35] - SC_param[38] + SC_param[40]
        t6 = t2 * SC_param_est[7]
        t7 = t3 * SC_param_est[9]
        t8 = t5 * SC_param[10]
        t9 = (-t6 + t4 - t7) * SC_param_est[0]
        t10 = SC_param[32] * SC_param[9]
        ...
        t638 = ...
        MCQ = np.array([[t1, 0, 0, 0, t37, t54, t54, -t127, t61, -t128, 0, -t126, t125, 0, -t91, -t106, -t106,
                         -t45 * t108 * s_dot_v[6] - t46 * t91, -t114 * t45 - t16 * t46,
                         -(t123 * t45 + t46 * t78) * SC_param_est[0], SC_param[7] * t124 * t1],
                        [0, t1, 0, -t31, 0, -t51, -t51, -t56, -t38, -t68, t126, 0, -t134, t129, 0, t131, t131,
                         t46 * t108 * s_dot_v[6] - t45 * t91, t114 * t46 - t16 * t45,
                         -SC_param_est[0] * (-t123 * t46 + t45 * t78), -t135 * t133 * t1], t86, t34, t36, t35,
                        [t54, -t51, 0, -t300, -t58, t89, t89, t115, t121, -t69, -t106, t131, 0, t450, t43, t55,
                         t55, t170, t76, t239, -t47], t10, t5, t2], dtype='float64')

我用我的程序测量了timeit部分的执行时间,这似乎是执行时间约为3ms的瓶颈(英特尔i7-8565U@1.8 GHz)

有没有适当的方法来加速这一进程


Tags: 代码selfparamdotestt1sct2
2条回答

经过进一步的研究和测试,我找到了一个解决方案。使用numba包,以下代码对我有效:

from numba import jit

@jit
def calc_MCQ_numba(SC_param, SC_param_est, q, s_dot_v):
    t1 = SC_param[3] + SC_param_est[0] + SC_param[10] + SC_param[9] + 
            SC_param[8]
    t2 = np.cos(q[9])
    t3 = np.sin(q[9])
    t4 = SC_param[38] - SC_param[41]
    t5 = SC_param[35] - SC_param[38] + SC_param[40]
    t6 = t2 * SC_param_est[7]
    t7 = t3 * SC_param_est[9]
    ...
    return np.array([[t1, 0, 0, 0, t37, t54, t54, -t127, t61, -t128, 0, -t126, t125, 0, -t91, -t106, -t106,
                  -t45 * t108 * s_dot_v[6] - t46 * t91, -t114 * t45 - t16 * t46,
                  -(t123 * t45 + t46 * t78) * SC_param_est[0], SC_param[7] * t124 * t1],
                 [0, t1, 0, -t31, 0, -t51, -t51, -t56, -t38, -t68, t126, 0, -t134, t129, 0, t131, t131,
                  t46 * t108 * s_dot_v[6] - t45 * t91, t114 * t46 - t16 * t45,
                  -SC_param_est[0] * (-t123 * t46 + t45 * t78), -t135 * t133 * t1], t86, t34, t36, t35,
                 [t54, -t51, 0, -t300, -t58, t89, t89, t115, t121, -t69, -t106, t131, 0, t450, t43, t55,
                  t55, t170, t76, t239, -t47], t10, t5, t2], dtype='float64')

使用此函数,第一次执行代码需要很长时间(在我的机器上大约需要25秒),但每次再次调用该函数都非常快。我成功地获得了10µs的执行时间-这与我的第一个结果相比是惊人的

许多赋值不是问题所在,而是在每种情况下计算出什么,然后分配给变量

从我所看到的,有很多数学函数,比如sincos和点积。我认为这些功能可能是你的瓶颈。也许您可以尝试减少这些操作的数量以加快您的功能

相关问题 更多 >