Cython课程列表

时间:2018-03-15 18:48:04

标签: cython

我是cython的新手,我需要构建一个类列表。

课程是:

cdef class Acl_cy:
    cdef int s0
    cdef str s1
    cdef str s2
    cdef str s3
    cdef str s4
    cdef int s5
    cdef int s6
    cdef str s7
    cdef str s8
    cdef str s9
    cdef int s10
    cdef str s11
    cdef int s12
    cdef int s13

如果在python list_tmp = []中创建一个列表并附加类。 它会工作,但它会转换python对象中的所有cython类,因此代码速度较慢。

是否可以创建类的cython向量,并在for循环中使用它?

由于

1 个答案:

答案 0 :(得分:1)

cython扩展类 python对象,所以没有任何实际的转换,但你的一般意义是,它可能是为生成的代码添加间接/开销。 / p>

最简单的方法是声明您正在访问的列表元素的类型,这将生成更有效的属性访问 - 下面是一个完整的示例。

除此之外,你可以将python对象全部放在一起并使用c-structs数组,c ++类的向量等等。

%%cython
cdef class Acl_cy:
    cdef public int s0, s1, s2
    cdef public str st0, st1, st2
    def __init__(self, s0, s1, s2, st0, st1, st2):
        self.s0 = s0
        self.s1 = s1
        self.s2 = s2
        self.st0 = st0
        self.st1 = st1
        self.st2 = st2

def make_list():
    l = []
    for _ in range(10000):
        l.append(Acl_cy(1, 2, 3, 'a', 'b', 'c'))
    return l

def loop():
    cdef list l = make_list()
    cdef int sum = 0
    for itm in l:
        sum += itm.s1
    return sum

def loop_typed():
    cdef list l = make_list()
    cdef Acl_cy itm
    cdef int sum = 0
    for itm in l:
        sum += itm.s1
    return sum

# In [274]: %timeit loop()
# 1.35 ms ± 67.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# In [275]: %timeit loop_typed()
# 808 µs ± 22.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)