我是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循环中使用它?
由于
答案 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)