Python Numba:如何以编程方式打开/关闭即时编译(设置Numba\u DISABLE\u JIT环境变量)?

Python Numba:如何以编程方式打开/关闭即时编译(设置Numba\u DISABLE\u JIT环境变量)?,python,jit,numba,Python,Jit,Numba,我编写了一个脚本,旨在测试我添加到几个函数中的@numba.jit装饰器的效果。我想首先在不进行实时编译的情况下练习带注释的函数,然后在使用@numba.jit装饰器的情况下再次练习,以便比较这两个结果 我尝试过通过os.environ修改NUMBA\u DISABLE\u JIT环境变量的值来实现这一点,但我不确定这是否达到了预期的效果。例如: # run first without and then with numba's just-in-time compilation for flag

我编写了一个脚本,旨在测试我添加到几个函数中的
@numba.jit
装饰器的效果。我想首先在不进行实时编译的情况下练习带注释的函数,然后在使用
@numba.jit
装饰器的情况下再次练习,以便比较这两个结果

我尝试过通过
os.environ
修改
NUMBA\u DISABLE\u JIT
环境变量的值来实现这一点,但我不确定这是否达到了预期的效果。例如:

# run first without and then with numba's just-in-time compilation
for flag in [1, 0]:

    # enable/disable numba's just-in-time compilation
    os.environ["NUMBA_DISABLE_JIT"] = str(flag)

    # time an arbitrary number of iterations of the JIT decorated function
    start = time.time()
    for _ in range(1000):
        expensive_function()
    end = time.time()

    # display the elapsed time
    if flag == 0:
        preposition = "with"
    else:
        preposition = "without"
    print("Elapsed time " + preposition + " numba: {t}".format(t=(end - start)))

上面的环境变量
DISABLE_NUMBA_JIT
的设置是否真的像我假设的那样,具有禁用/启用所有用
@NUMBA.JIT
修饰的函数的JIT编译的效果?如果没有,那么有没有更好的方法来剥这只猫的皮呢?

我认为这个标志只会影响第一次调用
昂贵的\u函数
,所以它不是你想要的

使用numba,您始终可以使用
.py\u func
访问原始python函数,因此这可能是一种更简单的方法

import numba

@numba.njit
def expensive_function(arr):
    ans = 0.0
    for a in arr:
        ans += a
    return ans

arr = np.random.randn(1_000_000)

In [21]: %timeit expensive_function(arr)
# 1.51 ms ± 24.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit expensive_function.py_func(arr)
# 134 ms ± 11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)