Passing/returning Cython Memoryviews Vs Numpy Arrays
Solution 1:
Memoryviews are a more recent addition to Cython, designed to be an improvement compared to the original np.ndarray
syntax. For this reason they're slightly preferred. It usually doesn't make too much difference which you use though. Here are a few notes:
Speed
For speed it makes very little difference - my experience is that memoryviews as function parameters are marginally slower, but it's hardly worth worrying about.
Generality
Memoryviews are designed to work with any type that has Python's buffer interface (for example the standard library array
module). Typing as np.ndarray
only works with numpy arrays. In principle memorviews can support an even wider range of memory layouts which can make interfacing with C code easier (in practice I've never actually seen this be useful).
As a return value
When returning an array from Cython to code Python the user will probably be happier with a numpy array than with a memoryview. If you're working with memoryviews you can do either:
return np.asarray(mview)
return mview.base
Ease of compiling
If you're using np.ndarray
you have to get the set the include directory with np.get_include()
in your setup.py
file. You don't have to do this with memoryviews, which often means you can skip setup.py
and just use the cythonize
command line command or pyximport
for simpler projects.
Parallelization
This is the big advantage of memoryviews compared to numpy arrays (if you want to use it). It does not require the global interpreter lock to take slices of a memoryview but it does for a numpy array. This means that the following code outline can work in parallel with a memoryview:
cdef void somefunc(double[:] x) nogil:
# implementation goes here
cdef double[:,:] 2d_array = np.array(...)
for i in prange(2d_array.shape[0]):
somefunc(2d_array[i,:])
If you aren't using Cython's parallel functionality this doesn't apply.
cdef
classes
You can use memoryviews as attributes of cdef
classes but not np.ndarray
s. You can (of course) use numpy arrays as untyped object
attributes instead.
Post a Comment for "Passing/returning Cython Memoryviews Vs Numpy Arrays"