Обратите внимание, что вы измеряете время для назначения переменных и определения включенной функции.
Кроме того, numba
может становиться (или казаться) медленнее, когда задание слишком маленькое, поскольку для его компиляции требуется время, а затем оно применяется.
Размещение integrand
вне цикла и декорирование с помощью @njit
может дать вам некоторое повышение производительности.Давайте посмотрим на некоторые сравнения:
from numba import njit
@njit
def integrand(t, i):
return np.exp(-arr[i]*t)/t**2
def tryFaster():
for i in range(len(arr)):
out[i] = quad(integrand, 1, np.inf, args=(i))[0]
Время, затраченное на len(arr) = 100
:
arr = np.arange(0.01,1.01,0.01)
%timeit tryThis()
# 29.9 ms ± 4.59 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit tryFaster()
# 4.99 ms ± 11.5 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Время, затраченное на len(arr) = 10,000
:
arr = np.arange(0.01,100.01,0.01)
%timeit tryThis()
# 1.43 s ± 208 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit tryFaster()
# 142 ms ± 17.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)