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

时间:2018-12-27 16:10:46

标签: python jit numba

我编写了一个脚本,该脚本旨在测试已添加到多个功能中的@numba.jit装饰器的有效性。我想先在没有即时编译的情况下执行带注释的函数,然后再使用@numba.jit装饰器进行操作,以比较两个结果。

我已经尝试通过NUMBA_DISABLE_JIT修改os.environ环境变量的值来做到这一点,但是我不确定这是否能达到预期的效果。例如:

# 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编译的作用?如果没有的话,有没有更好的方法来给这只猫皮呢?

在此先感谢您提出任何意见/建议。

1 个答案:

答案 0 :(得分:2)

我认为该标志仅对expensive_function的首次呼叫产生影响,因此不会执行您想要的操作。

使用numba,您始终可以使用.py_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)