【问题标题】:Avoid try catch in numba避免在 numba 中尝试 catch
【发布时间】:2018-04-14 08:07:05
【问题描述】:

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

比如某种“手动”捕获的错误信息?

【问题讨论】:

  • Numba 将其加速 > 10 倍(我能够使用非失败 json 进行测试)。我包括产生错误的最小示例。
  • 可能可以加速...,但不能加速JSON加载。
  • @user2357112 但是,如果我在 Numba 编译函数之外进行外部循环和 json 加载,我的加速度会大大降低。所以,在某个时候,我需要实施我的解决方案。

标签: python numba


【解决方案1】:

据我了解,这在 numba 编译的函数中是不可能的。您可以考虑将 json 读取与这些数据解耦,编写一个新的 json 解析器,或者如果可能的话,预先清理您的输入。

【讨论】:

    【解决方案2】:

    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 不支持带有字典和字符串的 nopython 模式,这不太可能)numba 将在 nopython 模式下编译 inner_func 并为您提供更多的加速。

    更一般地说:如果你的代码在你用@nb.njit 装饰它时编译它会非常快。如果它不使用@nb.njit 编译,而仅使用@nb.jit 编译,则您无法知道它是更快还是更慢,因为 numba 将使用对象模式和 nopython 模式的混合,所以有些部分会很快,其他部分会很慢。慢的部分不应该在 jitted 函数中(因为它们可能会阻止进一步的 numba 优化)。

    【讨论】:

    • 看,我发现当没有以这种方式重构它时,我的速度明显变慢,凭经验。此外,单独的 try catch 嵌套会导致具有非失败 json 的纯 numba 速度减慢。虽然它仍然快 10 倍左右(我在这方面做得还不够……在 jit 之后获得更快的速度)。
    • @bordeo 不,我没有看到,因为您没有包含相关代码和相关数据,也没有包含性能“测试”来评估性能。
    • 嗯,这里有很多人在工作。我没有发布我的代码,我的答案很理想。谢谢。
    • @bordeo 我不相信。您的回答是如何减慢 numba 功能的主要示例。如果它真的很慢,则可能是您正在测量编译成本(第一次调用 jited 函数时它很慢,因此您必须调用它一次以 jit 它然后测量以后调用的时间)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2012-02-26
    • 2017-02-13
    相关资源
    最近更新 更多