And usually you want to avoid invoking the python C API from cython unless you have to use it for some reason. The whole point of the typed memoryviews is that you get direct access to the raw memory buffer and can access it like a numpy array or even like a pointer array.
This blog post [0] incrementally shows how to get microoptimizations out of your cython code.
In the end, the autogenerated code is usually not too bad too follow since it's a one-to-one transpilation from the cython to C. cython -a helps a ton, or if you can use it, the cythonmagic [1] for the IPython notebook embeds the output of cython -a inline in a notebook, making the iteration process much quicker.
This blog post [0] incrementally shows how to get microoptimizations out of your cython code.
In the end, the autogenerated code is usually not too bad too follow since it's a one-to-one transpilation from the cython to C. cython -a helps a ton, or if you can use it, the cythonmagic [1] for the IPython notebook embeds the output of cython -a inline in a notebook, making the iteration process much quicker.
[0] https://jakevdp.github.io/blog/2012/08/08/memoryview-benchma...
[1] http://ipython.org/ipython-doc/2/config/extensions/cythonmag...