Cython: (De ce / Când) Este preferabil să folosiți Py_ssize_t pentru indexare? (Programare, Python, Numpy, Indexare, Cython, Număr Întreg Fără Semn)

embert a intrebat.

Aceasta este o continuare a acestei întrebări.

(De ce / Când) Este de preferat să se utilizeze Py_ssize_t pentru indexare? În docs am găsit

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

-> Asta înseamnă că întotdeauna când se indexează NumPy/Cython – array(s)/viziuni ar trebui să se folosească Py_ssize_t?

-> Este Py_ssize_t de ex. un unsigned int astfel încât să nu pot folosi @cython.boundscheck(False)

Comentarii

  • De asemenea, din documentația Cython: „Py_ssize_t este tipul C adecvat pentru indicii de matrice Python.” –  > Por Brad Solomon.
2 răspunsuri
Warren Weckesser

Py_ssize_t este semnat. Consultați PEP 353, unde se spune „Se introduce un nou tip Py_ssize_t, care are aceeași dimensiune ca tipul size_t al compilatorului, dar este semnat. Acesta va fi un typedef pentru ssize_t, acolo unde este disponibil.”

Ar trebui să utilizați Py_ssize_t pentru indexare. Nu am găsit o declarație definitivă în acest sens în documentele Cython, dar Stefan Behnel, un dezvoltator Cython, a spus același lucru într-un e-mail (https://groups.google.com/forum/#!topic/cython-users/brENF_M9zxM):

Ca o observație generală, utilizați ints ca indici. Ar trebui să folosiți în schimb tipul Py_ssize_t (sau size_t, dacă preferați un tip fără semn) pentru a vă adapta în mod corespunzător la arhitecturile pe 64 de biți.

Comentarii

  • > … sau size_t, dacă preferați un tip fără semn … Merită să subliniem că, în general, aceasta nu este o idee prea bună. Am văzut coduri care explodează din cauză că nu detectau returnările de eroare de la unele dintre funcțiile din biblioteca C Python care returnează -1 pentru a semnala o eroare, ceea ce se pierde dacă folosiți un tip fără semn. –  > Por Bob Kline.
Tim Peters

Py_ssize_t este un tipedef utilizat intern în implementarea CPython (implementarea C a Python – eu sunt nu vorbesc despre Cython, ci despre CPython). Este utilizat peste tot unde funcțiile API C Python acceptă sau returnează un întreg de nivel C care poate fi utilizat pentru indexarea secvențelor Python. De aceea, este tipul „corect” de utilizat pentru un index.

Py_ssize_t la rândul său, se rezolvă cu orice ortografie de platformă pentru semnat a variantei de platformă C fără semn size_t din platforma C. Așadar, este un tip de număr întreg cu semn, dar lățimea (numărul de biți) depinde de platforma pe care o utilizați.