我正在寻找比较使用numbajit(非python模式,python3)编译的python函数中字符串的最佳方法。在
用例如下:
import numba as nb
@nb.jit(nopython = True, cache = True)
def foo(a, t = 'default'):
if t == 'awesome':
return(a**2)
elif t == 'default':
return(a**3)
else:
...
但是,返回以下错误:
^{pr2}$我尝试使用字节,但没成功。在
谢谢!在
莫里斯指出了这个问题Python: can numba work with arrays of strings in nopython mode?,但我关注的是原生python,而不是numba支持的numpy子集。在
我建议接受@MSeifert的答案,但作为解决此类问题的另一种选择,请考虑使用
enum
。在在python中,字符串通常被用作一种枚举,并且
numba
对枚举有内置的支持,因此可以直接使用它们。在对于较新的numba版本(0.41.0及更高版本)
Numba(自0.41.0版起)支持^{} in nopython mode ,问题中所写的代码将“正常工作”。但是,对于您的例子,比较字符串比您的操作慢得多,因此如果您想在numba函数中使用字符串,请确保开销是值得的。在
在您的例子中,使用字符串的代码要慢10倍以上。在
由于您的函数功能不多,因此使用Python而不是numba进行字符串比较会更好更快:
^{pr2}$这仍然比纯整数版本慢一点,但比在numba函数中使用字符串快10倍。在
但是如果在numba函数中做了大量的数值运算,字符串比较开销就不重要了。但是简单地将
numba.njit
放在一个函数上,特别是如果它不做很多数组操作或数字运算,它不会自动更快!在对于旧的numba版本(0.41.0之前的版本):
Numba不支持
nopython
模式下的字符串。在从documentation:
所以字符串根本不受支持,字节也不支持相等性检查。在
但是,您可以传入
bytes
并对其进行迭代。这样就可以编写自己的比较函数:不幸的是,下一个问题是numba不能“减少”字节,所以不能直接在函数中硬编码字节。但是字节基本上只是整数,
bytes_equal
函数适用于numba支持的所有类型,这些类型都有一个长度,可以迭代。因此,您可以简单地将它们存储为列表:或者作为全局数组(谢谢@chrisb-见评论):
两者都能正常工作:
但是,不能将字节数组指定为默认值,因此需要显式地提供
t
变量。这样做也让人觉得很不舒服。在我的观点是:只需在普通函数中执行
if t == ...
检查,并在if
s中调用专门的numba函数。在Python中字符串比较非常快,只需将数学/数组密集的内容包装在numba函数中:但是要确保你真的需要numba来完成这些功能。有时候普通的Python/NumPy就足够快了。只需分析numba解决方案和Python/NumPy解决方案,看看numba是否能使它更快。:)
相关问题 更多 >
编程相关推荐