如果Numba不支持try catch语句,
解决方法是什么?
假设我正在解码一系列json对象,
for json_str in stream:
obj = json.loads(json_str)
有时可能不正确。
在标准的python中,我写道:
for json_str in stream:
try:
obj = json.loads(json_str)
...
sys.stdout.write(...)
except:
sys.stderr.write(...)
但是,在我的numba代码中,我无法使用try...except
构造。有办法解决这个问题吗?
比如某种'手册'捕获错误消息?
答案 0 :(得分:1)
Numba nopython-mode不支持的一切可能不会(明显地)比普通的Python更快,有时它甚至会更慢(甚至更少,它会慢得多)。根据你的描述,似乎你没有展示的是numba可以实际优化的东西。所以我的建议是重构隐藏在...
隐藏在使用jit
装饰的函数中的代码:
import numba as nb
import json
def main_func(stream):
for json_str in stream:
try:
obj = json.loads(json_str)
inner_func(obj)
sys.stdout.write(...)
except:
sys.stderr.write(...)
@nb.jit
def inner_func(obj):
...
因此,由numba实际支持和优化的部分是一个单独的函数,所有其他的东西都在外部函数中完成,而不是由numba进行的。如果你很幸运(但由于numba不支持带有dicts和字符串的nopython模式,这是不可能的)numba将在nopython模式下编译inner_func
并为你提供更多的加速。
更一般地说:如果您的代码在使用@nb.njit
进行装饰时进行编译,那么它将非常快。如果它不使用@nb.njit
进行编译,而只能使用@nb.jit
进行编译,则无法知道它是更快还是更慢,因为numba将使用对象模式和nopython模式的混合,因此某些部分会很快,其他部分会慢一点慢速部分不应该在jitted函数中(因为它们可能会阻止进一步的numba优化)。
答案 1 :(得分:0)
根据我的理解,这在numba编译的函数中是不可能的。您可以考虑将json读取与这些读取分离,编写新的json解析器,或者如果可能的话,事先清理输入。