numba - TypingError:无法确定 <class 'builtin_function_or_method'> 的 Numba 类型
Posted
技术标签:
【中文标题】numba - TypingError:无法确定 <class \'builtin_function_or_method\'> 的 Numba 类型【英文标题】:numba - TypingError: cannot determine Numba type of <class 'builtin_function_or_method'>numba - TypingError:无法确定 <class 'builtin_function_or_method'> 的 Numba 类型 【发布时间】:2018-11-17 13:45:06 【问题描述】:我有一个简单的函数来排列扑克手(手是字符串)。
我用rA,rB = rank(a),rank(b)
调用它,这是我的实现。没有@jit(nopython=True) 也能正常工作,但有了它,它就失败了:
File "...poker.py", line 190, in <module>
rA,rB = rank(a),rank(b)
File "C:\Continuum\anaconda3\lib\site-packages\numba\dispatcher.py", line 344, in _compile_for_args
reraise(type(e), e, None)
File "C:\Continuum\anaconda3\lib\site-packages\numba\six.py", line 658, in reraise
raise value.with_traceback(tb)
TypingError: cannot determine Numba type of <class 'builtin_function_or_method'>
from numba import jit
from numba.types import string
@jit(nopython=True)
def rank(hand):
# assert(len(hand) == 5)
rank = "N/A"
p = pd.Series([h[0] for h in hand]).value_counts()
v = sorted(set(pd.Series([h[0] for h in hand]).values), reverse=True)
s = sorted(hand, key=lambda k:k[0])
z = zip(s,s[1:])
if all(x[0]==y[0]-1 for x,y in z):
rank = "Straight "
if len(set([h[1] for h in hand])) == 1:
rank += "Flush "
if "Straight Flush" in rank and sum([h[0] for h in hand]) == sum([10,11,12,13,14]):
rank = "Royal Flush"
elif p[p.idxmax()] == 4:
rank = "4 Of A Kind : %d" % p.idxmax()
elif p[p.idxmax()] == 3 and p[p.idxmin()] == 1:
rank = "3 Of A Kind : %d" % p.idxmax()
elif p[p.idxmax()] == 3 and p[p.idxmin()] == 2:
rank = "Full House : %d,%d" % (p.idxmax(), p.idxmin())
elif p[p.idxmax()] == 2:
max2 = p.nlargest(2)
if list(max2) == [2,2]:
max2 = sorted(list(max2.keys()), reverse=True)
rank = "2 Pairs : %d,%d" % (max2[0],max2[1])
else:
rank = "Pair : %d" % p.idxmax()
else:
rank = "High Card : %d" % v[0]
return rank
【问题讨论】:
【参考方案1】:您的代码中的 Pandas 和其他几个函数调用将不适用于 nopython=True
。在 nopython 中可与 numba jit 一起使用的可用库相当有限(几乎仅限于 numpy 数组和某些 python 内置库)。您可以找到更多信息here
【讨论】:
有没有办法绕过它? (除了使用比 pandas 更简单的东西) 不幸的是,将您的系列转换为 numpy 数组数组可能是您唯一的选择。我相信您可能还必须在没有内置排序方法的情况下对值进行排序。请记住,numba 无法推断数据类型,因此您必须自己定义它们(即对于 numpy 数组np.array(..., dtype=np.float64)
)。通常,只有与 nopython 配合良好的库是用 CPython 编写的【参考方案2】:
根据deprecation recommendations,不使用@jit(nopython=True)
编译的代码可能没有装饰器会更快,这是非常合理的。
有趣的是,我发现我在这里研究的简单示例在简单地将 Pandas 列直接传递给我的函数到 vectorize the operation 时明显更快,而不是使用 numba 并为 numpy 数组支付列的方法开销。
但是,它会继续使用预期的参数来清除此警告
如果存在
@jit
装饰器有好处,那么为了将来证明,提供关键字参数forceobj=True
以确保函数始终在对象模式下编译。
【讨论】:
以上是关于numba - TypingError:无法确定 <class 'builtin_function_or_method'> 的 Numba 类型的主要内容,如果未能解决你的问题,请参考以下文章
TypingError:在 nopython 模式管道中失败(步骤:nopython 前端)
使用 numba 无法获得与 numpy 元素矩阵乘法相同的值
Python numpy:无法将 datetime64[ns] 转换为 datetime64[D](与 Numba 一起使用)