Numba ( ) ufuncs @jit. , @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.