我正在使用此功能:
def read_example(water_bound, filename, conditions):
f = open(filename,"r")
for i in range(0, conditions):
lines = f.readline()
test = map(int, lines.split(' '))
water_bound.append( test[0]-1 )
我希望能够将其与numba
一起使用。据我所知here,我必须在我的函数声明之前添加这一行:
@jit('void(int32[:], c_string_type, int32 )',nopython=True)
但是,我收到了这个错误:
NameError:name' c_string_type'未定义
答案 0 :(得分:3)
你应该看看numba documentation,它解释了支持哪些python功能。这些是nopython
模式支持的功能(与python相比实际上加快了速度):
for
,if
等),包括生成器但不支持文件i / o。因此,您需要jit
您的功能,但它会以nopython
模式失败。
只要分析一下你的功能就会明确表示你不会加速:
文件I / O将回退到python(慢)模式:
f = open(filename,"r")
这个for循环适用于nopypthon
模式,因为它受支持(如果循环中的所有内容都可以用numba构造编译):
for i in range(0, conditions):
不幸的是,readline又是文件I / O,不受支持:
lines = f.readline()
split
之类的字符串操作无法以nopython
模式编译:
test = map(int, lines.split(' '))
如果(且仅当)您的列表water_bound
仅包含数字,并且您想要附加另一个数字,它应该有效(请参阅numba list reference)但是使用字符串我无法获取它用nopython
编译的计算机。
water_bound.append( test[0]-1 )
所以你可以jit
你的功能,但是因为它回退到python模式你不需要打扰signatures
(因为它们只有在你进入快速时才开始重要nopython模式)很可能你不会看到任何速度优势:
from numba import jit
@jit
def read_example_numba(water_bound, filename, conditions):
f = open(filename,"r")
for i in range(0, conditions):
lines = f.readline()
test = map(int, lines.split(' '))
water_bound.append( test[0]-1 )
在我的计算机上带有一些随机生成的文件:
使用jit:10000循环,最佳3:78.1 ms每循环
没有jit:10000循环,最好是每循环3:71.4 ms
你应该看看Numba Documentation Examples他们展示哪种功能可以加速。