Python 麻麻表演
我使用了很多numba的Python 麻麻表演,python,numba,Python,Numba,我使用了很多numba的jitdecorator,最近我意识到numba增加了新功能,特别是parallel选项和stencildecorator 模具非常适合制作更干净的代码,但经过几次测试后,它看起来很漂亮,效率不高。下面是一个示例代码: @numba.njit def nb_jit(A, out): for i in range(1, A.shape[0]-1): out[i] = 0.5*(A[i+1] - A[i-1]) return out @nu
jit
decorator,最近我意识到numba增加了新功能,特别是parallel
选项和stencil
decorator
模具非常适合制作更干净的代码,但经过几次测试后,它看起来很漂亮,效率不高。下面是一个示例代码:
@numba.njit
def nb_jit(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(numba.float64[:](numba.float64[:], numba.float64[:]))
def nb_jit_typed(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(parallel=True)
def nb_jit_paral(A, out):
for i in numba.prange(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.stencil
def s2(A):
return 0.5*(A[1] - A[-1])
@numba.njit
def nb_stencil(A):
return s2(A)
@numba.njit(parallel=True)
def nb_stencil_paral(A):
return s2(A)
我使用以下阵列测试了这些函数:
import numpy as np
arr = np.random.rand(100000)
res = arr.copy()
它给出了以下执行时间(当然,我在timeit之前执行了每个函数一次!):
所以我想知道:
- 为什么
比nb\u-jit\u-typed
慢?在我的记忆中,上次我测试这个时正好相反nb\u-jit
- 为什么
这么慢李>nb\u jit\u parallel
- 我正确使用模具了吗?我的意思是,以这种方式使用模具会导致性能损失,那么我们为什么要使用它呢
注意:
import numba
numba.__version__
'0.37.0'
import multiprocessing
multiprocessing.cpu_count()
4
编辑:
import numba
numba.__version__
使用time.time()(不带任何GUI),使用维度数组(1000000,)对相同函数进行10000次重复计时:
是的,
numba
是一个很棒的工具。然而,您如何将测试与介入的O/S+GUI操作隔离开来?您是否可以通过一些非GUI工具+进行一些体面的1E+3测试重复来重新测试相同的结果,以便看到更多的结果,除了偶然发现一个单代码执行示例受到来自外部生态系统的测试外部影响的影响之外,还有什么特殊的原因或理由使修饰后的函数仍然以昂贵的、python可互操作的模式进行测试,而没有更好的跨步技巧和显式设置nogil=True,nopython=True
?我使用@njit
,这与@jit(nopython=True)
@njit(fastmath=True)通常也值得一试为什么jit\u并行速度这么慢?如果parallel=true,则循环不使用Numba 0.37进行simd矢量化。这将随着即将发布的版本0.38而改变。
jit | 16.37 s
jit typed | 17.22 s
jit parallel | 18.45 s
stencil | 21.95 s
stencil paral | 24.48 s