Подтвердить что ты не робот

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

Это продолжение этого вопроса.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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