首页 文章

在cython中声明numpy数组和c指针

提问于
浏览
7

在我的代码中,我通常使用numpy数组来连接方法和类 . 优化我的程序的核心部分我使用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行代码,而且我经常需要声明更多这些数组 .

是否有更紧凑/聪明的方法来做到这一点?我想我错过了什么 .

EDIT:

所以因为J. Martinot-Lagarde问我,我指的是C指针和“numpy指针” . 代码基本上是

for ii in range(someArraySize):
    someArrayPointers[ii] += 1

for ii in range(someArraySize):
    someArrayBuff[ii] += 1

与上面的定义,但我添加“ndim = 1,mode ='c'”只是为了确保 . 结果是someArraySize = 1e8(以ms为单位的时间):

testMartinot("cPointers")
531.276941299
testMartinot("numpyPointers")
498.730182648

这是我从之前/不同的基准测试中粗略记住的 .

1 回答

  • 6

    你实际上在这里声明了两个numpy数组,第一个是通用的,第二个是特定的dtype . 你可以跳过第一行,someArrayBuff是一个ndarray .

    这给出了:

    numpy.ndarray[numpy.double_t] someArrayNumpy = numpy.zeros(someArraySize)
    double *someArrayPointers = <double *> someArrayNumpy.data
    

    你需要至少两行,因为你正在使用someArrayPointers并返回someArrayNumpy,所以你必须声明它们 .


    作为旁注,如果声明数组的类型和数量,你确定指针比ndarray更快吗?

    numpy.ndarray[numpy.double_t, ndim=2] someArrayNumpy = numpy.zeros(someArraySize)
    

相关问题