web-dev-qa-db-fra.com

Cython: (Pourquoi / Quand) Est-il préférable d'utiliser Py_ssize_t pour l'indexation?

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)

37
embert

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.

32
Warren Weckesser

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.

21
Tim Peters