【发布时间】:2017-10-23 05:20:32
【问题描述】:
我有一个用 numba 编写的相当大的代码库,我注意到当为调用另一个文件中的另一个 numba 编译函数的函数启用缓存时,当被调用函数发生更改时,被调用函数的更改不会被拾取.当我有两个文件时会出现这种情况:
测试文件2:
import numba
@numba.njit(cache=True)
def function1(x):
return x * 10
测试文件:
import numba
from tests import file1
@numba.njit(cache=True)
def function2(x, y):
return y + file1.function1(x)
如果在 jupyter 笔记本中,我运行以下命令:
# INSIDE JUPYTER NOTEBOOK
import sys
sys.path.insert(1, "path/to/files/")
from tests import testfile
testfile.function2(3, 4)
>>> 34 # good value
但是,如果我更改,则将 testfile2 更改为以下内容:
import numba
@numba.njit(cache=True)
def function1(x):
return x * 1
然后我重新启动 jupyter notebook 内核并重新运行 notebook,我得到以下内容
import sys
sys.path.insert(1, "path/to/files/")
from tests import testfile
testfile.function2(3, 4)
>>> 34 # bad value, should be 7
将这两个文件导入笔记本对不良结果没有影响。此外,仅在 function1 上设置 cache=False 也无效。起作用的是在所有 njit 的函数上设置 cache=False,然后重新启动内核,然后重新运行。
我相信 LLVM 可能是内联了一些被调用的函数,然后不再检查它们。
我查看了源代码,发现有一个方法返回缓存对象numba.caching.NullCache(),实例化了一个缓存对象并运行以下内容:
cache = numba.caching.NullCache()
cache.flush()
不幸的是,这似乎没有效果。
是否有 numba 环境设置,或者我可以手动清除 conda env 中的所有缓存函数的其他方式?还是我只是做错了什么?
我在 Mac OS X 10.12.3 上使用 Anaconda Python 3.6 运行 numba 0.33。
【问题讨论】:
-
更新:杀死
__pycache__目录中的所有文件 numba 使用 does 似乎有效。不过,不确定是否有更好的方法。