我正在處理下面這段代碼,它創建了一個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'/span>)
我用timeit測量了我的程式各部分的執行時間,這似乎是一個瓶頸,執行時間約為3ms(Intel i7-8565U @ 1.8 GHz)。
有什么適當的方法來加快這個速度嗎?
uj5u.com熱心網友回復:
許多賦值不是問題,而是在每種情況下計算的內容,然后分配給變數。
從我所看到的,有很多數學函式,如sin,cos和點積。我認為這些函式可能是你的瓶頸。也許你可以嘗試減少這些操作的數量,以加快你的函式。
uj5u.com熱心網友回復:
經過進一步的研究和測驗,我找到了一個解決方案。使用numba包,以下代碼對我來說是有效的:
from numba import 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'/span>)
使用這個函式,第一次執行代碼需要很長的時間(在我的機器上大約25秒),但每次函式被再次呼叫時都非常快。我成功地得到了10μs的執行時間--與我的第一個結果相比,這是很驚人的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/309437.html
標籤:
