【问题标题】:Strings and numba字符串和 numba
【发布时间】:2021-06-21 18:32:18
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: python numba


    【解决方案1】:

    当我将 [:] 替换为 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']
    

    【讨论】:

    • 非常感谢您的回复和解释。您的代码有效,但以大量警告消息为代价,我无法将它们复制到这里。我会和你的 sn-p 一起玩,看看我能从中学到什么。也许我应该说我在 Xubuntu 20.04-64 机器上使用 Python 3.8.5 和 numba 0.53.0。
    • 我认为我的问题的一部分(但不是全部)与我在将 Comps 传递给__init__() 后想要做的事情有很大关系。我想通过使用 self.Comp = Comps.copy() 将它复制到另一个列表,而 numba 不知何故不喜欢那样,无论我使用什么方法来制作该副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2018-03-24
    • 2019-11-13
    • 1970-01-01
    • 2019-10-21
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多