Python 如何预热Numba';什么是准时制?

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]

我一直在与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]
        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
code
numba
速度极快,但更缺乏宽容和活力。对于非常大的数组和矢量化的
numpy
code(这并不总是可能的),
jit
的速度并不是很快。它是在几个版本之前实现的,也许您使用的是非常旧的numba版本?numba的另一个替代方案是numexpr。