【发布时间】:2013-01-28 04:55:03
【问题描述】:
我在 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
【问题讨论】:
-
q不是一个列表,而是一个原生数组。我猜你将不得不使用较低级别的东西来处理这些。 (传递一个数组和一个开始+结束索引。) -
@millimoose 我看了一下文档中的 memoryview 内容,但我无法使用我的简单示例使其工作。我是 cython 和 C 编程的新手。你是什么意思想让你谈论低级和“传递数组和开始+结束索引”?谢谢
-
在 C 语言中,当您使用数组时,通常不仅仅使用数组,而是使用
start和length参数来指示函数应该在数组的哪一部分继续工作。数组和两个索引一起代表一个“切片”。 (例如,如果您查看一些用于快速排序的示例代码,您可以看到这一点。)也就是说,这对于我不太熟悉的 Cython 来说可能是非常过分的。 -
@millimoose 你能告诉我在哪里可以找到快速排序的示例代码吗?这正是我需要对数组进行切片的原因,以便为实现 KDtree 制作许多 qsort(我已经在 python 中做过,但需要将其转移到 cython 以提高速度)