我在这个代码片段中尝试numba
from numba import jit import numpy as np from time import time db = np.array(np.random.randint(2, size=(400e3, 4)), dtype=bool) out = np.zeros((int(400e3), 1)) @jit() def check_mask(db, out, mask=[1, 0, 1]): for idx, line in enumerate(db): target, vector = line[0], line[1:] if (mask == np.bitwise_and(mask, vector)).all(): if target == 1: out[idx] = 1 return out st = time() res = check_mask(db, out, [1, 0, 1]) print 'with jit: {:.4} sec'.format(time() - st)
使用numba @jit()装饰器,这段代码运行得更慢!
没有jit:3.16秒
与jit:3.81秒
只是为了帮助更好地理解这段代码的目的:
db = np.array([ # out value for mask = [1, 0, 1] # target, vector # [1, 1, 0, 1], # 1 [0, 1, 1, 1], # 0 (fit to mask but target == 0) [0, 0, 1, 0], # 0 [1, 1, 0, 1], # 1 [0, 1, 1, 0], # 0 [1, 0, 0, 0], # 0 ])
serge-sans-p.. 5
另外,您可以尝试Pythran (免责声明:我是Pythran的开发人员)。
使用单个注解,它将编译以下代码
#pythran export check_mask(bool[][], bool[]) import numpy as np def check_mask(db, out, mask=[1, 0, 1]): for idx, line in enumerate(db): target, vector = line[0], line[1:] if (mask == np.bitwise_and(mask, vector)).all(): if target == 1: out[idx] = 1 return out
致电pythran check_call.py
。
根据timeit
,生成的本机模块运行速度非常快:
python -m timeit -s 'n=1e4; import numpy as np; db = np.array(np.random.randint(2, size=(n, 4)), dtype=bool); out = np.zeros(int(n), dtype=bool); from eq import check_mask' 'check_mask(db, out)'
告诉我CPython版本在中运行,136ms
而Pythran编译版本在中运行450us
。
另外,您可以尝试Pythran (免责声明:我是Pythran的开发人员)。
使用单个注解,它将编译以下代码
#pythran export check_mask(bool[][], bool[]) import numpy as np def check_mask(db, out, mask=[1, 0, 1]): for idx, line in enumerate(db): target, vector = line[0], line[1:] if (mask == np.bitwise_and(mask, vector)).all(): if target == 1: out[idx] = 1 return out
致电pythran check_call.py
。
根据timeit
,生成的本机模块运行速度非常快:
python -m timeit -s 'n=1e4; import numpy as np; db = np.array(np.random.randint(2, size=(n, 4)), dtype=bool); out = np.zeros(int(n), dtype=bool); from eq import check_mask' 'check_mask(db, out)'
告诉我CPython版本在中运行,136ms
而Pythran编译版本在中运行450us
。