Ceci est un suivi de cette question .
(Pourquoi/Quand) Est-il préférable d'utiliser Py_ssize_t
Pour l'indexation? Dans le docs je viens de trouver
# Purists could use "Py_ssize_t" which is the proper Python type for # array indices.
-> Est-ce que cela signifie toujours lors de l'indexation de NumPy/Cython - tableau (s)/- vues, il faut utiliser Py_ssize_t
?
-> Est Py_ssize_t
E. g. un unsigned int
pour que je ne puisse pas utiliser @cython.boundscheck(False)
Py_ssize_t
est signé. Voir PEP 35 , où il dit "Un nouveau type Py_ssize_t est introduit, qui a la même taille que le type size_t du compilateur, mais est signé. Ce sera un typedef pour ssize_t s'il est disponible. "
Tu devrais utiliser Py_ssize_t
pour l'indexation. Je n'ai pas trouvé de déclaration définitive à ce sujet dans la documentation Cython, mais Stefan Behnel, un développeur Cython, l'a dit dans un e-mail ( https://groups.google.com/forum/#!topic/ cython-users/brENF_M9zxM ):
En règle générale, vous utilisez des ints comme indices. Vous devez utiliser le type Py_ssize_t à la place (ou size_t, si vous préférez un type non signé) pour convenir correctement aux architectures 64 bits.
Py_ssize_t
est un typedef utilisé en interne dans l'implémentation de CPython (l'implémentation C de Python - I'm not parle de Cython ici, je parle de CPython ). Il est utilisé partout Python Les fonctions de l'API C acceptent ou renvoient un entier de niveau C qui peut être utilisé pour l'indexation Python séquences. C'est pourquoi c'est "le bon "type à utiliser pour un index.
Py_ssize_t
à son tour résout ce que l'orthographe de la plate-forme est pour la variante signé du non signé de la plate-forme C size_t
type. Il s'agit donc d'un type entier signé, mais sa largeur (nombre de bits) dépend de la plate-forme que vous utilisez.