Python 在树结构中使用numba的指导原则是什么?
编辑:忘记多次运行numba(哎呀!) 我把namedtuple和Dict的numba版本视为潜在的解决方案,但与python版本相比,它们似乎慢了很多(大约10000x)Python 在树结构中使用numba的指导原则是什么?,python,data-structures,numba,Python,Data Structures,Numba,编辑:忘记多次运行numba(哎呀!) 我把namedtuple和Dict的numba版本视为潜在的解决方案,但与python版本相比,它们似乎慢了很多(大约10000x) import time from numba import njit from collections import namedtuple Alpha = namedtuple("Alpha", ["a", "b", "c"])
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.0747349492622375488秒完成其执行
编辑:
build_params_numba花了3.5762786865234375e-06秒完成它的执行。最大的问题是,您正在测量
build_params_numba
的第一次执行,其中包括编译(按照您的要求及时编译)。这就像测量一顿经典晚餐和一顿微波晚餐之间的用餐时间,但你要包括购买和安装微波炉的时间,作为后者的一部分。编译完成后,查看编译函数的执行情况
第二个问题是
numba
可能对代码没有多大帮助。AFAIK设计用于加速数值算法和numpy代码。根据需要,namedtuple
和dict
都是Python数据结构,numba
必须将它们视为Python数据结构;因此,即使您请求了模式,Numba也不能强制执行,因为它只在代码中的所有值都可以检测到本机数据类型时才起作用(我认为-在这一点上不是100%确定)。最大的问题是您正在测量build\u params\u Numba
的第一次执行,其中包括编译(按照您的要求及时编译)。这就像测量一顿经典晚餐和一顿微波晚餐之间的用餐时间,但你要包括购买和安装微波炉的时间,作为后者的一部分。在编译完成后,查看编译函数的执行情况
第二个问题是,
numba
可能对您的代码没有多大帮助。当然,它是为了加速数值算法和numpy代码而设计的。必要时,namedtuple
和dict
是Python数据结构,numba
必须将它们视为Python数据结构;因此,即使您请求了mode,numba也无法禁用ge,因为它只有在代码中的所有值都可以检测到本机数据类型时才起作用(我认为-在这一点上不是100%确定)。首先是一个公平点(完全忘记添加XD),在第二次迭代中,速度是无法区分的。关于第二点,我有很多其他函数使用numba,它将构建新的params实例,然后使用许多数值算法。一旦numba编译该函数,该函数是否仍然很快,即使在多处理中调用,还是需要重新编译对于每个核心?抱歉,我不知道。测试应该很明显,区别非常显著:)谢谢,我现在给你分数,除非/直到其他人有更好的方式来思考numba中的树!第一个是一个公平点(完全忘记添加XD),而在第二个迭代中,速度是无法区分的。关于第二点,我有很多其他函数,它们使用numba来构建新的params实例,然后使用一些数值算法。一旦numba编译了这个函数,即使在多处理中调用它,这个函数还是会很快,还是需要为每个核心重新编译?对不起,我不知道。测试应该是显而易见的,区别是非常显著的:)谢谢,我现在给你分数,除非/直到其他人有更好的方式来思考numba中的树!