使用numba运行嵌套函数

use*_*189 8 python jit numba

我最近尝试使用numba来加速我在python中的部分代码.我试图从函数2内部运行函数1,而它们都是用numba编译但是它不起作用.这是我的代码:

import numba as nb
from math import acos
from time import time

@nb.jit("void()")
def myfunc():
    s = 0
    for i in range(10000000):
        s += acos(0.5)
    print('The sum is: ', s)


@nb.jit("void()")
def myfunc2():
    myfunc()


tic = time()
myfunc2()
toc = time()
print(toc-tic)
Run Code Online (Sandbox Code Playgroud)

当我调用myfunc()代码时,我得到的结果比不使用numba的速度快得多.但是,当我打电话给myfunc2我时,我看到了这个错误:

 File "~/.spyder-py3/temp.py", line 22, in <module>
    myfunc2()

RuntimeError: missing Environment
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法为什么从insdie调用一个函数另一个在这种情况下不起作用?

jpp*_*jpp 3

Numba v0.39+

v0.39 中引入了修复。根据发行说明

PR #2986:修复环境传播

有关更多详细信息,请参阅github pull #2986 。

Numba v0.39 之前版本

这是一个已知的问题。如github 问题 #2411中所述:

似乎环境指针没有在 nopython 函数之间正确传递。

如下修改以print()numba函数中删除应该可以解决此问题:

import numba as nb
from math import acos
from time import time

@nb.jit("void()")
def myfunc():
    s = 0
    for i in range(10000000):
        s += acos(0.5)
    return s

@nb.jit("void()")
def myfunc2():
    return myfunc()

tic = time()
x = myfunc2()  # 10471975.511390356
toc = time()
print(toc-tic)
Run Code Online (Sandbox Code Playgroud)