[英]Declaring numpy array and c pointer in cython
在我的代碼中,我通常使用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(以ms為單位的時間):
testMartinot("cPointers")
531.276941299
testMartinot("numpyPointers")
498.730182648
這是我從之前/不同的基准測試中粗略記住的。
你實際上在這里聲明了兩個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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.