numba-jitclass

参考文档:https://numba.pydata.org/numba-doc/latest/user/jitclass.html#

jitclass

对类进行装饰

import numba as nb
import numpy as np
from numba.experimental import jitclass

spec = [
    ("value", nb.int32),
    ("array", nb.float32[:]),
]


@jitclass(spec)
class Bag:
    def __init__(self, value):
        # self.value = value
        self.array = np.zeros(value, dtype=np.float32)

    @property
    def size(self):
        return self.array.size

    def increment(self, val):
        for i in range(self.size):
            self.array[i] += val

        return self.array


a = 2
b = Bag(a)
print("b.increment(1): ", b.increment(1))  # b.increment(1):  [1. 1.]

上面例子中,spec 提供了一个两元组元素的数组,元组包含字段名称和类型。也可以使用有序字典映射字段与类选的关系。
类中至少要初始化每个定义的字段,如果不初始化,字段会包含垃圾数据。

具体的 numb.typed 容器(container)做类成员
  1. 显式的类型和构建
kv_ty = (nb.types.int64, nb.types.unicode_type)


@jitclass(
    [("d", nb.types.DictType(*kv_ty)), ("l", nb.types.ListType(nb.types.float64))]
)
class ContainerHolder:
    def __init__(self):
        self.d = nb.typed.Dict.empty(*kv_ty)
        self.l = nb.typed.List.empty_list(nb.types.float64)


c = ContainerHolder()
c.d[1] = "apple"
c.d[2] = "orange"
c.l.append(1.0)
c.l.append(2.0)

print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange}
print("c.l: ", c.l)  # c.l:  [1.0, 2.0]
  1. 另一个有用的模式是用 numba.typed 的 _numba_type_ 属性能够找找到容器的类型, 这样可以直接在 python 解释器中访问容器的实例。使用 numba.typeof 可以得到跟容器实例一样的信息。如下:
d = nb.typed.Dict()
d[1] = "apple"
d[2] = "orange"

l = nb.typed.List()
l.append(1.0)
l.append(2.0)


@jitclass([("d", nb.typeof(d)), ("l", nb.typeof(l))])
class ContainerInsHolder:
    def __init__(self, dict_instance, list_instance):
        self.d = dict_instance
        self.l = list_instance


c = ContainerInsHolder(d, l)
print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange}
print("c.l: ", c.l)  # c.l:  [1.0, 2.0]
c.d[3] = "banana"
print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange, 3: banana}

需要注意的是,容器实例在使用前必须要初始化,否则会有异常,如下面的是错误的:

d_ty = nb.types.DictType(nb.types.int64, nb.types.unicode_type)


@jitclass([("d", d_ty)])
class NotInitContainer:
    def __init__(self):
        self.d[10] = "apple"  # d 没有被初始化,这里是无效的


NotInitContainer()  # 实例化会失败,内存访问无效,程序会异常结束 Process finished with exit code -1073741819 (0xC0000005)
支持的操作

以下 jitclasses 操作在 python 解释器和 numba 编译的函数中都支持:

  • 用 jitclass 类实例化对象。(如: bag = Bag(123))
  • 读/写属性。(如:bag.value)
  • 方法调用。(如:bag.increment(2))
  • 调用实例的静态方法。(如:bag.add(1, 2))
  • 调用类的静态方法。(如:Bag.add(1,2))
局限性
  • jitclass 被看作是一个 numba 的编译函数
  • isinstance() 只能在 python 解释器中使用
完整代码
import numba as nb
import numpy as np
from numba.experimental import jitclass

spec = [
    ("value", nb.int32),
    ("array", nb.float32[:]),
]


@jitclass(spec)
class Bag:
    def __init__(self, value):
        # self.value = value
        self.array = np.zeros(value, dtype=np.float32)

    @property
    def size(self):
        return self.array.size

    def increment(self, val):
        for i in range(self.size):
            self.array[i] += val

        return self.array


a = 2
b = Bag(a)
print("b.increment(1): ", b.increment(1))  # b.increment(1):  [1. 1.]

print("-" * 20)
kv_ty = (nb.types.int64, nb.types.unicode_type)


@jitclass(
    [("d", nb.types.DictType(*kv_ty)), ("l", nb.types.ListType(nb.types.float64))]
)
class ContainerHolder:
    def __init__(self):
        self.d = nb.typed.Dict.empty(*kv_ty)
        self.l = nb.typed.List.empty_list(nb.types.float64)


c = ContainerHolder()
c.d[1] = "apple"
c.d[2] = "orange"
c.l.append(1.0)
c.l.append(2.0)

print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange}
print("c.l: ", c.l)  # c.l:  [1.0, 2.0]


print("-" * 20)

d = nb.typed.Dict()
d[1] = "apple"
d[2] = "orange"

l = nb.typed.List()
l.append(1.0)
l.append(2.0)


@jitclass([("d", nb.typeof(d)), ("l", nb.typeof(l))])
class ContainerInsHolder:
    def __init__(self, dict_instance, list_instance):
        self.d = dict_instance
        self.l = list_instance


c = ContainerInsHolder(d, l)
print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange}
print("c.l: ", c.l)  # c.l:  [1.0, 2.0]
c.d[3] = "banana"
print("c.d: ", c.d)  # c.d:  {1: apple, 2: orange, 3: banana}


print("-" * 20)
d_ty = nb.types.DictType(nb.types.int64, nb.types.unicode_type)


@jitclass([("d", d_ty)])
class NotInitContainer:
    def __init__(self):
        self.d[10] = "apple"  # d 没有被初始化,这里是无效的


NotInitContainer()  # 实例化会失败,内存访问无效,程序会异常结束 Process finished with exit code -1073741819 (0xC0000005)
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值