Python 如何预热Numba';什么是准时制?
我一直在与Numba抗争,因为每当我为它编写函数时,它都会有一个很长的预热时间,这是我第一次使用它。我想问的是,有没有办法预热JIT功能 例如,如果我将此函数Python 如何预热Numba';什么是准时制?,python,numpy,jit,numba,warm-up,Python,Numpy,Jit,Numba,Warm Up,我一直在与Numba抗争,因为每当我为它编写函数时,它都会有一个很长的预热时间,这是我第一次使用它。我想问的是,有没有办法预热JIT功能 例如,如果我将此函数y=1/(log(x+0.1))^2作为Numba函数编写: @jit(parallel=True,error_model='numpy') def f_numba(x_vec): N=len(x_vec) res=np.empty(N) for i in prange(N): x=x_vec[i]
y=1/(log(x+0.1))^2作为Numba函数编写:
@jit(parallel=True,error_model='numpy')
def f_numba(x_vec):
N=len(x_vec)
res=np.empty(N)
for i in prange(N):
x=x_vec[i]
x=np.log(x+0.1)
res[i]=1/(x*x)
return res
N=150000
x_vect=np.random.rand(N)
我使用这个数组来测试函数的速度:
@jit(parallel=True,error_model='numpy')
def f_numba(x_vec):
N=len(x_vec)
res=np.empty(N)
for i in prange(N):
x=x_vec[i]
x=np.log(x+0.1)
res[i]=1/(x*x)
return res
N=150000
x_vect=np.random.rand(N)
为了测量函数的执行时间,我使用了:
for i in range(5):
start=timer()
f_numba(x_vect)
print('#',timer()-start)
第一次运行需要0.8秒,所有后续运行需要0.001秒。如果我能以某种方式预热JIT函数以避免这种延迟,那就太好了。我使用x\u warm=np.random.rand(10)
尝试第一次运行一个小尺寸的虚拟数组,然后运行f\u numba(x\u warm)
,但预热时间一点也没有改变。有什么建议吗
对于完成论,以下是称为:
import numpy as np
from timeit import default_timer as timer
from numba import jit, prange
我正在使用Python3.7的Jupyter笔记本。jit
代表“及时”——它旨在在运行时编译。Python是一种解释语言,不是(通常)编译的,所以在大多数情况下预编译并不是一件真正的事情。这是可能的(这就是为什么numpy
速度如此之快,因为它大部分是在后端预编译的c代码),但这通常不是一项简单的任务。您可以尝试cache=True
来缓存编译结果。初始化缓存算法也可能需要一些时间,但如果您有多个函数,它肯定会产生显著的效果。@DanielF但是,如果预编译了numpy,为什么JIT比numpy更快用于大型数组?因为numpy
还内置了许多防护栏,以确保包是“pythonic”的且灵活的,还有一些前端python
codenumba
速度极快,但更缺乏宽容和活力。对于非常大的数组和矢量化的numpy
code(这并不总是可能的),jit
的速度并不是很快。它是在几个版本之前实现的,也许您使用的是非常旧的numba版本?numba的另一个替代方案是numexpr。