我正在编写下面的一段代码,它创建一个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)
有没有适当的方法来加速这一进程
经过进一步的研究和测试,我找到了一个解决方案。使用
numba
包,以下代码对我有效:使用此函数,第一次执行代码需要很长时间(在我的机器上大约需要25秒),但每次再次调用该函数都非常快。我成功地获得了10µs的执行时间-这与我的第一个结果相比是惊人的
许多赋值不是问题所在,而是在每种情况下计算出什么,然后分配给变量
从我所看到的,有很多数学函数,比如
sin
、cos
和点积。我认为这些功能可能是你的瓶颈。也许您可以尝试减少这些操作的数量以加快您的功能相关问题 更多 >
编程相关推荐