【问题标题】:What are the guidelines for using numba for a tree structure?将 numba 用于树结构的准则是什么?
【发布时间】:2021-05-31 03:26:25
【问题描述】:

编辑:忘记多次运行 numba(哎呀!)

我将 namedtuple 和 Dict 的 numba 版本视为潜在的解决方案,但与 Python 对应的版本相比,它们似乎要慢得多(大约慢 10000 倍)。

import time
from numba import njit
from collections import namedtuple    

Alpha = namedtuple("Alpha", ["a", "b", "c"])    
Regions = namedtuple("Regions", ["a", "b"])    
State = namedtuple("State", ["H", "L"])    
Parameters = namedtuple("Parameters", ["alpha", "DB", "beta", "psi", "pi", "CC_opt"])    

def timer_func(func):
    def function_timer(*args, **kwargs):    
        start = time.time()    
        value = func(*args, **kwargs)    
        end = time.time()    
        runtime = end - start    
        msg = "{func} took {time} seconds to complete its execution."    
        print(msg.format(func=func.__name__, time=runtime))    
        return value    

    return function_timer    


@timer_func    
def build_params() -> Parameters:    
    alpha = Regions(    
        a=Alpha(0.5, 0.5, 0),    
        b=Alpha(0.5, 0.5, 0),    
    )    

    return Parameters(alpha=alpha, DB=State(0.0, 0.0), beta=0.8, psi=0.0, pi=0.5, CC_opt=1.0)    


@timer_func    
@njit    
def build_params_numba() -> Parameters:    
    alpha = Regions(    
        a=Alpha(0.5, 0.5, 0),    
        b=Alpha(0.5, 0.5, 0),    
    )    

    return Parameters(alpha=alpha, DB=State(0.0, 0.0), beta=0.8, psi=0.0, pi=0.5, CC_opt=1.0)    


if __name__ == "__main__":    
    build_params()    
    build_params_numba()

build_params 花了 3.814697265625e-06 秒来完成它的执行。

build_params_numba 用了 0.07473492622375488 秒来完成它的执行。

编辑:

build_params_numba 用了 3.5762786865234375e-06 秒来完成它的执行。

【问题讨论】:

    标签: python data-structures numba


    【解决方案1】:

    最大的问题是您正在测量 build_params_numba 的第一次执行,其中包括编译(它是即时编译的,正如您所要求的那样)。这就像测量一顿经典餐和一顿微波炉餐之间的用餐时间,但您将购买和安装微波炉的时间计算在内,作为后者的一部分。 Measure the second invocationbuild_params_numba,当编译已经完成时,看看编译后的函数是如何执行的。

    第二个问题是numba 可能对您的代码没有太大帮助。 AFAIK 它旨在加速数值算法和 numpy 代码。必要时,namedtupledict 是 Python 数据结构,numba 必须这样对待它们;因此,即使您请求了nopython 模式,Numba 也不能强制执行,因为它仅在可以为您的代码中的所有值检测到本机数据类型时才有效(我认为 - 虽然在这一点上不是 100% 确定)。

    【讨论】:

    • 第一次是公平点(完全忘记添加XD),第二次迭代速度无法区分。对于第二点,我有许多其他使用 numba 的函数,它们将构建新的参数实例,然后使用一些数值算法。一旦 numba 编译了函数,即使在多处理中调用该函数仍然很快,还是需要为每个内核重新编译?
    • 对不起,我不知道。测试一下,应该很明显了,区别很明显:)
    • 谢谢,我现在就给你加分,除非/直到其他人有更好的方式来思考 numba 中的树木!
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2012-05-24
    相关资源
    最近更新 更多