4 python numpy numexpr numba parakeet
我想知道是否有人知道长尾小鹦鹉和Numba jit之间的一些关键区别?我很好奇,因为我正在比较Numexpr与Numba和长尾小鹦鹉,以及这个特殊的表达式(我希望它在Numexpr上表现得非常好,因为它是文档中提到的那个)
结果是

和我测试的功能(通过timeit - 每个功能最少3次重复和10次循环)
import numpy as np
import numexpr as ne
from numba import jit as numba_jit
from parakeet import jit as para_jit
def numpy_complex_expr(A, B):
return(A*B-4.1*A > 2.5*B)
def numexpr_complex_expr(A, B):
return ne.evaluate('A*B-4.1*A > 2.5*B')
@numba_jit
def numba_complex_expr(A, B):
return A*B-4.1*A > 2.5*B
@para_jit
def parakeet_complex_expr(A, B):
return A*B-4.1*A > 2.5*B
Run Code Online (Sandbox Code Playgroud)
如果你想仔细检查机器上的结果,我也可以抓住IPython nb.
如果有人想知道Numba是否安装正确......我是这么认为的,它在我以前的基准测试中表现如预期:

截至当前发布的Numba(您在测试中使用),对该@jit函数的ufuncs的支持不完整.另一方面,你可以@vectorize更快地使用它:
import numpy as np
from numba import jit, vectorize
import numexpr as ne
def numpy_complex_expr(A, B):
return(A*B+4.1*A > 2.5*B)
def numexpr_complex_expr(A, B):
return ne.evaluate('A*B+4.1*A > 2.5*B')
@jit
def numba_complex_expr(A, B):
return A*B+4.1*A > 2.5*B
@vectorize(['u1(float64, float64)'])
def numba_vec(A,B):
return A*B+4.1*A > 2.5*B
n = 1000
A = np.random.rand(n,n)
B = np.random.rand(n,n)
Run Code Online (Sandbox Code Playgroud)
时间结果:
%timeit numba_complex_expr(A,B)
1 loops, best of 3: 49.8 ms per loop
%timeit numpy_complex_expr(A,B)
10 loops, best of 3: 43.5 ms per loop
%timeit numexpr_complex_expr(A,B)
100 loops, best of 3: 3.08 ms per loop
%timeit numba_vec(A,B)
100 loops, best of 3: 9.8 ms per loop
Run Code Online (Sandbox Code Playgroud)
如果你想充分利用numba,那么你想要展开任何矢量化操作:
@jit
def numba_unroll2(A, B):
C = np.empty(A.shape, dtype=np.uint8)
for i in xrange(A.shape[0]):
for j in xrange(A.shape[1]):
C[i,j] = A[i,j]*B[i,j] + 4.1*A[i,j] > 2.5*B[i,j]
return C
Run Code Online (Sandbox Code Playgroud)
%timeit numba_unroll2(A,B)
100 loops, best of 3: 5.96 ms per loop
Run Code Online (Sandbox Code Playgroud)
另请注意,如果将numexpr使用的线程数设置为1,那么您将看到它的主要速度优势是它的并行化:
ne.set_num_threads(1)
%timeit numexpr_complex_expr(A,B)
100 loops, best of 3: 8.87 ms per loop
Run Code Online (Sandbox Code Playgroud)
默认情况下,numexpr ne.detect_number_of_cores()用作线程数.对于我在我的机器上的原始时间,它使用8.
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |