如何在Cython中切片列表

3 投票
1 回答
2405 浏览
提问于 2025-04-17 15:39

我在使用cython的时候,有一个列表,我想要对它进行切片操作,但不想用Python对象(这样速度会更快)。

cdef int len = 100    
cdef int *q
cdef int *r

q = <int *>malloc( len *cython.sizeof(int) )

r = q[50:]

结果我遇到了这个错误:

r = q[50:]
    ^
------------------------------------------------------------

hello.pyx:24:9: Slicing is not currently supported for 'int *'.

有没有什么有效的方法可以做到呢?看到“...当前不支持...”这句话让我有点害怕。我用的是cython 0.18。

1 个回答

3

通过使用类型化内存视图,我们可以实现快速切片和一些其他很酷的功能。不过,要进行切片,你需要一些关于数组的元数据,所以最好使用数组类型,而不是普通的指针。如果想了解更多信息,可以查看文档:http://docs.cython.org/src/userguide/memoryviews.html

对你问题的一个修改可以得到:

cdef int q_array[5] # c array
cdef int[:] q # 1D memview
cdef int[:] r # another 1D memview

q = q_array # point q to data
r = q[2:] # point r to a slice of q

r[0] = 5 # modify r

# test                                                                      
print q[2]
print r[0]

如果你真的很想从切片中创建指针,也是可以的:

# ...

cdef int* r_ptr
cdef int* q_ptr

r_ptr = &r[0]
q_ptr = &q[0]

print q_ptr[2]
print r_ptr[0]

这也适用于numpy数组:

import numpy as np

cdef int[:] q = np.arange(100).astype('int32') # slow
cdef int[:] r

r = q[50:] # fast slicing

print r[0]

撰写回答