避免尝试捕获numba

时间:2017-11-01 22:09:33

标签: python numba

如果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构造。有办法解决这个问题吗?

比如某种'手册'捕获错误消息?

2 个答案:

答案 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解析器,或者如果可能的话,事先清理输入。