Cython: (Why / When) Is it preferable to use Py_ssize_t for indexing? Cython: (Why / When) Is it preferable to use Py_ssize_t for indexing? numpy numpy

Cython: (Why / When) Is it preferable to use Py_ssize_t for indexing?


Py_ssize_t is signed. See PEP 353, where it says "A new type Py_ssize_t is introduced, which has the same size as the compiler's size_t type, but is signed. It will be a typedef for ssize_t where available."

You should use Py_ssize_t for indexing. I didn't find a definitive statement of this in the Cython docs, but Stefan Behnel, a Cython developer, said as much in an email (https://groups.google.com/forum/#!topic/cython-users/brENF_M9zxM):

As a general remark, you are using ints as indices. You should use the Py_ssize_t type instead (or size_t, if you prefer an unsigned type) to properly accommodate for 64 bit architectures.


Py_ssize_t is a typedef used internally in the implementation of CPython (the C implementation of Python - I'm not talking about Cython there, I'm talking about CPython). It's used everywhere Python C API functions accept or return a C-level integer that can be used for indexing Python sequences. That's why it's "the correct" type to use for an index.

Py_ssize_t in turn resolves to whatever the platform spelling is for the signed variant of the platform C's unsigned size_t type. So it's some signed integer type, but its width (number of bits) depends on the platform you're using.