tutorial - python numpy
Cython:(Por qué/Cuándo) ¿Es preferible usar Py_ssize_t para indexar? (2)
Py_ssize_t
es un typedef usado internamente en la implementación de CPython (la implementación C de Python - no estoy hablando de Cython, estoy hablando de CPython). Se usa en todas partes. Las funciones API de Python C aceptan o devuelven un entero de nivel C que se puede usar para indexar secuencias de Python. Es por eso que es el tipo "correcto" para usar en un índice.
Py_ssize_t
a su vez resuelve lo que sea que la ortografía de la plataforma sea para la variante firmada del tipo sin signo size_t
de la plataforma C. Por lo tanto, se trata de un tipo de entero con signo, pero su ancho (número de bits) depende de la plataforma que esté utilizando.
Esta es una continuación de esta pregunta .
(Por qué / Cuándo) ¿Es preferible usar Py_ssize_t
para indexar? En los docs que acabo de encontrar
# Purists could use "Py_ssize_t" which is the proper Python type for # array indices.
-> ¿ Py_ssize_t
significa siempre que al indexar NumPy / Cython - array (s) / - views debería usarse Py_ssize_t
?
-> Es Py_ssize_t
por ejemplo, un unsigned int
por lo que no puedo usar @cython.boundscheck(False)
Py_ssize_t
está firmado. Vea PEP 353 , donde dice "Se ha introducido un nuevo tipo Py_ssize_t, que tiene el mismo tamaño que el tipo size_t del compilador, pero está firmado. Será un tipodef para ssize_t donde esté disponible".
Debería usar Py_ssize_t
para indexar. No encontré una declaración definitiva de esto en los documentos de Cython, pero Stefan Behnel, un desarrollador de Cython, lo dijo en un correo electrónico ( https://groups.google.com/forum/#!topic/cython-users/brENF_M9zxM ):
Como observación general, estás usando ints como índices. Debería usar el tipo Py_ssize_t en su lugar (o size_t, si prefiere un tipo sin firmar) para acomodarse correctamente para las arquitecturas de 64 bits.