Numba加速嵌套函数

问题描述 投票:0回答:2

我曾尝试使用numba来accelerate lambda function,但我没有这样做。 numba不支持lambda。所以我将lambda函数重写为def函数。我正在构造一个隐式函数f(x,y,z)= x ^ 2 + y ^ 2-z ^ 2和其他一些函数,它们只会在构造之后进行一次计算。 xi,yi,zi用于隐式函数的转换。

def wrapperNode(xi,yi,zi,R):

    @nb.jit(nopython=True)
    def Node(x,y,z):
        x = xi - x
        y = yi - y
        z = zi - z
        return x**2 + y**2 - z**2

    return Node

import time
for i in range(10):
    Start = time.time()
    Node = wrapperNode(i+1.0,i+2.0,i+3.0,i+4.0)
    a = Node(1.0,2.0,3.0)
    Final = time.time()
    print(Final-Start)

每个循环的时间结果:

0.137923002243042
0.14062094688415527
0.14144468307495117
0.1332840919494629
0.12716078758239746
0.14055514335632324
0.14062023162841797
0.1423487663269043
0.14061713218688965
0.1943662166595459

它实际上比简单地评估包装函数中的Node函数要慢得多。每次我更改包装器函数的输入参数时,如果我评估它,计算机必须编译Node函数。所以没有加速......我正在寻找一种加速整个包装函数的方法。如果有人有任何想法,请帮助。谢谢!

python numba
2个回答
1
投票

它不仅是编译,也是“jitted”功能的调度。

使用numba jit进行这样一个只有标量组件的简单函数是不值得的。如果参数是数据数组并且操作​​将以矢量方式执行,那么它将有意义......但仅当元素数量增加时才有意义。

在numba中你有两个开销:1。编译2.调度(给定的函数可能有不同的编译版本,基于参数的类型,因此必须完成调用的类型签名,检查内部字典是否完成基于该签名,参数未拆箱并且实际调用已完成)。这需要不可忽视的时间。因此,您需要一个足够复杂的功能来分摊这次

经验法则:它不适用于没有循环的简单代码,无论是显式(for,while ......)还是隐式(矢量代码都可以通过@numba.vectorize更好地处理)。


0
投票

您可以尝试使用缓存以避免每次调用该函数时重新编译

@nb.jit(nopython=True,cache=True)

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.