numba 没有加速代码的编译

numba did not speed up the compilation of code

我在 numba 和正常模式下尝试了这段代码,但都在 13 秒内完成,而且 numba 没有增加速度

这种情况下如何设置numba?

import numpy as np
from numba import jit, cuda
a=[]
@jit(target_backend="cuda")
def func():
    for i in range(100000):
        a.append(i)
    return a

print(func())


 

这里不能用CUDA因为这段代码不能在GPU上运行(即使修改也很低效)。 GPU 与 CPU 非常不同,它们的编程方式也不同。要了解原因,请阅读CUDA programming guide

如果您只是 运行 代码并 阅读来自 Numba 的警告,那么您可以看到代码 回退到基本 Python 实施:

Compilation is falling back to object mode WITH looplifting enabled because Function "func" failed type inference due to: Untyped global name 'a': Cannot type empty list

原因是 a 的类型没有提供,Numba 找不到它。 Numba 速度很快,因为它的类型系统使它能够将代码编译为本机二进制文件。

此外,您不应修改全局变量。就软件工程而言,这不是一个好主意,而且 Numba 也不支持它。

因此,您需要使用从函数返回的类型列表。并不是说当 read/written from/to CPython 时,类型列表并不比 Python 列表快多少,因为 Numba 必须进行 转换 from/to C Python 列出 这是一项昂贵的操作。尽管如此,在我的机器上这还是快了 3 倍。

更正后的代码:

import numpy as np
from numba import jit, cuda

@jit
def func():
    a=[]
    for i in range(100000):
        a.append(i)
    return a

func() # Compile the function during the first run

a = func() # Execute quickly the code

print(a) # Printing is slow

有关惰性编译的更多信息请阅读Numba documentation