2014-01-08 3 views
24

Это последующая деятельность после this question.Cython: (Why/When) Предпочтительно использовать Py_ssize_t для индексирования?

(Почему/когда) Предпочтительно использовать Py_ssize_t для индексирования? В docs я только что нашел

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

-> Означает ли это, всегда при индексировании NumPy/Cython - массив (ы)/- вид на один следует использовать Py_ssize_t?

->Py_ssize_t e. г. a unsigned int, так что я не могу использовать @cython.boundscheck(False)

ответ

19

Py_ssize_t подписан. См. PEP 353, где указано «Введен новый тип Py_ssize_t, который имеет тот же размер, что и тип size_t компилятора, но подписан. Это будет typedef для ssize_t, где доступно».

Для индексирования вы должны использовать Py_ssize_t. Я не нашел окончательное заявление об этом в документации Cython, но Стефан Behnel, разработчик Cython, так и сказал по электронной почте (https://groups.google.com/forum/#!topic/cython-users/brENF_M9zxM):

В качестве общего замечания, вы используете Интс в качестве индексов , Вместо этого вы должны использовать тип Py_ssize_t (или size_t, если вы предпочитаете неподписанный тип), чтобы должным образом разместить для 64-битных архитектур.

14

Py_ssize_t является ЬурейиМ для внутреннего использования в реализации CPython (реализации C в Python - Я не говорить о Cython там, я говорю о CPython). Он используется везде. Функции API Python C принимают или возвращают целое число C-уровня, которое можно использовать для индексирования последовательностей Python. Именно поэтому для индекса используется «правильный» тип.

Py_ssize_t в свою очередь, решает, независимо от платформы правописание для варианта платформы C в беззнаковое size_t типа подписал. Таким образом, это некоторый знак целого типа, но его ширина (количество бит) зависит от используемой вами платформы.