#python #numba
Вопрос:
Есть ли какой-нибудь способ быстрее вычислить эту часть кода? Я искал Numba для распараллеливания этих 2 циклов for, потому что они могут быть вычислены независимо, но это будет мой первый опыт работы с кодом Nuba. Кто-нибудь может сказать мне, как подключить это к Numba?
import mpmath as mp import numpy as np import sympy tau_list=[0.03,0.792,1.028,1.264,1.596,1.928,2.376,2.824,3.412,4,5.6,7.795,10.806,14.928,19,20.599,25,26,27,28.0] j0_list=[0.46869280348572745,0.31126617004146684,1.2291545442765266,0.5878946139591783,0.22483672941857252,0.1915490644008199,0.13419373039766042,0.10174018105286561] j1_list=[8.573678368076493,3.0816000979381206,95.49105733185763,15.107589571301576,1.366515689572122,0.9154751539258457,0.37607722961298173,0.18822518805900257,0.08878080390128372] def f(s): return s**(beta - 1)/(j0*s**beta j1*sympy.gamma(beta 1)) K=[] for k0, j0, j1 in zip(tau_list, j0_list, j1_list): t_K = np.linspace(k0, 30, kend) G1 = [] for j in range(len(t_K)): G1.append(float(mp.invertlaplace(f, t_K[j], method = 'dehoog', dps = 10, degree = 50))) K.append(G1) K = np.asarray(K)
Я знаю, что мне нужно подключить функцию и использовать для этого Numba, но мои попытки не увенчались успехом. Это моя попытка :
import mpmath as mp import numpy as np import sympy from __future__ import print_function, division, absolute_import import numpy as np import numba from numba import jit # -*- coding: utf-8 -*- nd4type = numba.double[:,:,:,:] def f(s): return s**(beta - 1)/(j0*s**beta j1*sympy.gamma(beta 1)) @jit(nopython=True) def faster(tau_list,j0_list,j1_list): K=[] for k0, j0, j1 in zip(tau_list, j0_list, j1_list): t_K = np.linspace(k0, 30, kend) G1 = [] for j in range(len(t_K)): G1.append(float(mp.invertlaplace(f, t_K[j], method = 'dehoog', dps = 10, degree = 50))) K.append(G1) K = np.asarray(K) return K
Комментарии:
1. Вы не можете использовать Numba здесь из-за
mp.invertlaplace
вызова: Numba поддерживает только (часть) функций Numpy, а не внешние модули. Таким образом, вы также не можете распараллелить его с Numba. Вы могли бы попробовать Cython, но это тоже не сработает, если модуль не отключит GIL (и, похоже, он, к сожалению, использует его).