如何在Numba的@jitclass中传递另一个@jitclass类作为属性类型?
解决Numba jitclass中包含单个jitclass类型属性的问题
当你在定义被@jitclass装饰的Position类时,直接把OrderBook类本身写进spec会报错,因为Numba的jitclass spec要求每个属性对应Numba类型实例,而不是jitclass的类对象。
解决方法
显式使用jitclass生成的类型实例,也就是通过OrderBook.class_type来获取这个类型,然后写进Position的spec里。
完整代码示例
from numba import jitclass, int64, float64 # 先定义OrderBook jitclass order_book_spec = [ ('bid_price', float64), ('ask_price', float64), ('bid_size', int64), ('ask_size', int64) ] @jitclass(order_book_spec) class OrderBook: def __init__(self, bid_price, ask_price, bid_size, ask_size): self.bid_price = bid_price self.ask_price = ask_price self.bid_size = bid_size self.ask_size = ask_size # 获取OrderBook对应的Numba类型实例 ob_numba_type = OrderBook.class_type # 定义包含单个OrderBook属性的Position jitclass position_spec = [ ('position_size', int64), ('avg_price', float64), ('last_ob', ob_numba_type) # 这里用类型实例而非类本身 ] @jitclass(position_spec) class Position: def __init__(self, position_size, avg_price, last_ob): self.position_size = position_size self.avg_price = avg_price self.last_ob = last_ob
为什么列表类型可以直接用OrderBook?
types.ListType(OrderBook)能正常编译是因为Numba在处理ListType的参数时,会自动调用传入类的.class_type属性获取对应的类型实例,不需要你手动指定。但单个属性的spec没有这个自动处理逻辑,所以必须显式传入类型实例。
内容的提问来源于stack exchange,提问作者Jerem Lachkar
相关产品推荐
相关产品推荐

