gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:46:49 28 4
gpt4 key购买 nike

在我的代码中,我通常使用 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 行代码,而且我经常不得不声明更多这样的数组。

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

编辑:

因此,因为 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(时间以毫秒为单位):

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

这就是我从以前/不同的基准测试中大致记得的内容。

最佳答案

您实际上在这里声明了两个 numpy 数组,第一个是通用的,第二个具有特定的数据类型。你可以跳过第一行,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)

关于python - 在 cython 中声明 numpy 数组和 c 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17570013/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com