简体   繁体   中英

Declaring numpy array and c pointer in cython

In my code I usally use numpy arrays to interface between methods and classes. Optimizing the core parts of my program I use cython with c pointers of those numpy arrays. Unforunately, the way I'm currently declaring the arrays is quite long.

For example, let's say I have a method which should return a numpy array someArrayNumpy, but inside the function pointers *someArrayPointers should be used for speed. This is how I usually declare this:

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

As you can see, this takes up 3 lines of code for basically one array, and often I have to declare more of those arrays.

Is there a more compact/clever way to do this? I think I am missing something.

EDIT:

So because it was asked by J. Martinot-Lagarde I timed C pointers and "numpy pointers". The code was basically

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

and

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

with the definitions from above, but I added "ndim=1, mode='c'" just to make sure. Results are for someArraySize = 1e8 (time in ms):

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

That's what I roughly remember from previous/different benchmarks.

You're actually declaring two numpy arrays here, the first one is generic and the second one has a specific dtype. You can skip the first line, someArrayBuff is a ndarray.

This gives :

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

You need at least two lines because you're using someArrayPointers and returning someArrayNumpy so you have to declare them.


As a side note, are you sure that pointers are faster than ndarrays, if you declare the type and the number of dimensions of the array ?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM