Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

This is a follow-up to this question.

(Why / When) Is it preferable to use Py_ssize_t for indexing? In the docs I just found

# Purists could use "Py_ssize_t" which is the proper Python type for
# array indices.

-> Does that mean always when indexing NumPy/Cython - array(s)/-views one should use Py_ssize_t?

-> Is Py_ssize_t e. g. an unsigned int so that I can't used @cython.boundscheck(False)

like image 610
embert Avatar asked Jan 08 '14 05:01

embert


2 Answers

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.

like image 172
Warren Weckesser Avatar answered Oct 16 '22 14:10

Warren Weckesser


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.

like image 44
Tim Peters Avatar answered Oct 16 '22 13:10

Tim Peters