在我的代码中,我通常使用numpy数组来在方法和类之间进行接口。优化我的程序的核心部分我使用cython与这些numpy数组的c指针。不幸的是,我目前声明数组的方式非常长。在cython中声明numpy数组和c指针
例如,假设我有应该返回一个numpy的阵列someArrayNumpy的方法,但是函数指针内* someArrayPointers应该用于速度。这就是我通常这样声明:
cdef:
numpy.ndarray someArrayNumpy = numpy.zeros(someArraySize)
numpy.ndarray[numpy.double_t, ndim=1] someArrayBuff = someArrayNumpy
double *someArrayPointers = <double *> someArrayBuff.data
[... some Code ...]
return someArrayNumpy
正如你所看到的,这个占用3行代码基本上一个阵列,而且往往我要宣布更多的阵列。
是否有一个更紧凑的/聪明的方式做到这一点?我想我错过了一些东西。
编辑:
,是因为它被要求J.马丁诺特-拉加德我计时C指针和 “numpy的指针”。该代码基本上
for ii in range(someArraySize):
someArrayPointers[ii] += 1
和
for ii in range(someArraySize):
someArrayBuff[ii] += 1
与上面的定义,但我补充说: “NDIM = 1,模式= 'C'”,以确保公正。结果是someArraySize = 1e8(时间以毫秒为单位):
testMartinot("cPointers")
531.276941299
testMartinot("numpyPointers")
498.730182648
这就是我从之前/不同的基准测试中大致记得的。
如果有人正在阅读:现在我开始使用类型的cython记忆体。根据我的经验,它们非常接近C指针(比numpy缓冲区更接近)并且使用起来更容易。事实上,在一些罕见的情况下,我用C指针使得它们比类型化的内存视图更慢,从而导致“小”(因此不容易识别/避免)错误。我真的建议在有可能的情况下输入记忆体视图。 – oli