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。
我在 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。