python - 字符串和 numba
问题描述
我正在使用类和 numba 编写一个非常简单的 Python 代码,直到我有了将字符串数组传递给__init__()
. 第一个相关的代码行如下所示:
import numpy as np
from numba import float64, types
from numba.experimental import jitclass
spec = [('p_', float64), ('T_', float64), ('pc_', float64), ('Tc_', float64), \
('rhoc', float64), ('omega_', float64), ('MW_', float64), \
('zf', float64), ('rho', float64), ('visc', float64), \
('Comps', types.unicode_type[:]), ('Y', float64[:])]
@jitclass(spec)
class Viscosity:
def __init__(self, p_, T_, Comps, Y):
....
Comps是给我带来麻烦的东西。通常,Comps类似于np.array(['CH4','C2H6'])
. 我可能把它变成了一个简单的列表,['CH4','C2H6']
而不是一个数组,但这并不重要,因为它无论如何都不起作用。代码中的任何地方都不会对这些字符串进行数字或字符串操作;我只是想让它们传递给__init__()
.
我找到了一个简单的例子,其中一个字符串被声明为types.unicode_type
并试图将它调整到我稍微复杂的情况下,但它没有用。
应该有一种方法可以避免这种情况,因为没有对字符串进行任何处理。我不妨从我的代码中彻底清除 numba,因为在这个小项目中执行时间并不重要,而且可能永远不会成为问题。但我不喜欢轻易放弃这类事情的想法。
谢谢你的帮助。
解决方案
当我更换[:]
为types.ListType
. 考虑到 jitclass 的所有方法都编译成 nopython 函数。
import numpy as np
from numba import float64, f8, types
from numba.experimental import jitclass
spec = [('p_', float64), ('T_', float64), ('pc_', float64), ('Tc_', float64), \
('rhoc', float64), ('omega_', float64), ('MW_', float64), \
('zf', float64), ('rho', float64), ('visc', float64), \
('Comps', types.ListType(types.unicode_type)), ('Y', types.ListType(f8))]
@jitclass(spec)
class Viscosity:
def __init__(self, p_, T_, Comps, Y):
return print(Comps)
Viscosity(2.0, 2.0, ["a", "b"], [1.0, 2.0])
# ['a' 'b']