gpt4 book ai didi

python - 长尾小鹦鹉与 Numba 有何不同?因为我没有看到某些 NumPy 表达式有任何改进

转载 作者:太空狗 更新时间:2023-10-30 02:45:39 29 4
gpt4 key购买 nike

我想知道是否有人知道长尾小鹦鹉和 Numba jit 之间的一些主要区别?我很好奇,因为我正在将 Numexpr 与 Numba 和长尾小鹦鹉进行比较,并且对于这个特定的表达式(我希望它在 Numexpr 上表现得非常好,因为它是它的文档中提到的)

所以结果是

enter image description here

和我测试的功能(通过 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

我你也可以抢IPython nb如果您想在您的机器上仔细检查结果。

如果有人想知道 Numba 是否安装正确......我想是的,它在我之前的基准测试中的表现符合预期:

enter image description here

最佳答案

截至当前版本的 Numba(您在测试中使用的),@jit 函数对 ufunc 的支持不完整。另一方面,您可以使用 @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)

计时结果:

%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

如果您想充分利用 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

%timeit numba_unroll2(A,B)
100 loops, best of 3: 5.96 ms per loop

另请注意,如果将 numexpr 使用的线程数设置为 1,那么您会发现它的主要速度优势在于它是并行化的:

ne.set_num_threads(1)
%timeit numexpr_complex_expr(A,B)
100 loops, best of 3: 8.87 ms per loop

默认情况下,numexpr 使用 ne.detect_number_of_cores() 作为线程数。对于我机器上的原始计时,它使用的是 8。

关于python - 长尾小鹦鹉与 Numba 有何不同?因为我没有看到某些 NumPy 表达式有任何改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23776547/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com