Python 如何从numba结构类型创建结构?

Python 如何从numba结构类型创建结构?,python,numba,Python,Numba,我可以使用以下命令定义numba结构类型: from numba import struct, int32 my_struct_type = struct([('value_a', int32), ('value_b', int32)]) 既然我有了类型,那么如何创建一个实际的结构呢?可以在 您创建的结构是numpy,而不是Python中的实际新类型 对于您的代码示例,这将是: my_struct_type = struct([('value_a', int32), ('value_b',

我可以使用以下命令定义numba结构类型:

from numba import struct, int32

my_struct_type = struct([('value_a', int32), ('value_b', int32)])

既然我有了类型,那么如何创建一个实际的结构呢?

可以在

您创建的结构是numpy,而不是Python中的实际新类型

对于您的代码示例,这将是:

my_struct_type = struct([('value_a', int32), ('value_b', int32)])
my_struct = np.array([(1, 2)], dtype=my_struct_type)

numba.struct
不再存在,您现在只需使用自定义的复杂
dtype
传入标准
numpy
数组即可

import numpy as np # version 1.10.1
import numba # version 0.22.1

@numba.jit(nopython=True)
def sum_basic_array(a):
    ret = 0
    for aa in a:
        ret += aa
    return ret

@numba.jit(nopython=True)
def sum_struct_array(a):
    ret = 0
    for aa in a:
        ret += aa.sub_0
    return ret

x_basic = np.arange(20000*3, dtype=np.uint32)
x_struct = x_basic.view(dtype=np.dtype([('sub_0', np.int32),
                                        ('sub_1', np.float64)]))

%timeit sum_basic_array(x_basic) # 18 µs
%timeit sum_struct_array(x_struct) # 8 µs
%timeit sum_struct_array(x_struct.view(np.recarray)) # 40 µs

请注意,
sum\u struct\u数组
的迭代次数是原来的三分之一,因此速度更快也就不足为奇了。

您提交了一个针对
numba
的文档错误,让他们告诉您;-)听起来非常合理。这里,有一个upmod!:)
import numpy as np # version 1.10.1
import numba # version 0.22.1

@numba.jit(nopython=True)
def sum_basic_array(a):
    ret = 0
    for aa in a:
        ret += aa
    return ret

@numba.jit(nopython=True)
def sum_struct_array(a):
    ret = 0
    for aa in a:
        ret += aa.sub_0
    return ret

x_basic = np.arange(20000*3, dtype=np.uint32)
x_struct = x_basic.view(dtype=np.dtype([('sub_0', np.int32),
                                        ('sub_1', np.float64)]))

%timeit sum_basic_array(x_basic) # 18 µs
%timeit sum_struct_array(x_struct) # 8 µs
%timeit sum_struct_array(x_struct.view(np.recarray)) # 40 µs