首页 > 解决方案 > 字符串和 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,因为在这个小项目中执行时间并不重要,而且可能永远不会成为问题。但我不喜欢轻易放弃这类事情的想法。

谢谢你的帮助。

标签: pythonnumba

解决方案


当我更换[:]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']

推荐阅读