Я написал некоторый код для вычисления n матриц на основе n элементов в списке, а затем в конце умножил все матрицы вместе.
Код относительно медленный, и я хотел бы узнать больше об оптимизации Python. Я использовал инструменты профилирования и определил, что замедление в моей программе связано с циклом умножения матриц.
Интересно, есть ли у кого-нибудь какие-либо рекомендации о том, как я могу ускорить это, возможно, воспользовавшись встроенными функциями на основе C в Python / NumPy?
def my_matrix(x):
# Initialise overall matrix as an identity matrix
# | M_11 M_12 |
# | M_21 M_22 |
M = np.matrix([[1, 0],[0, 1]])
for z in z_all:
param1 = func1(z)
param2 = func2(x, z)
param3 = func3(x, z)
M_11 = param1 + param2
M_12 = param1 - param2
M_21 = param1 * param2
M_22 = param1 / param2
# Multiply matrix with overall master matrix
M = M * np.matrix([[M_11, M_12],[M_21, M_22]])
return M
Из небольшого справочного чтения кажется, что вызовы функций требуют больших вычислительных ресурсов, поэтому вычисление массивов для моих параметров, а затем доступ к массивам может быть более эффективным, чем оценка функции в цикле каждый раз... например.
param1s = funcs(z_all)
param2s = funcs(x, z_all)
etc
а затем в цикле for:
for i, z in enumerate(z_all):
param1 = params1[i]
param2 = params2[i]
etc.
Это быстрее, но только примерно на 10%, поскольку экономия от меньшего количества вызовов функций компенсируется временем, затрачиваемым на доступ к массиву с использованием param1 = params1[i] в цикле.
У кого-нибудь есть рекомендации, пожалуйста?