Outils personnels
Vous êtes ici : Accueil Python Quoi de neuf dans Python 2.5 PEP 353: Utiliser ssize_t comme index

PEP 353: Utiliser ssize_t comme index

Par Benjamin Poulain - Dernière modification 18/04/2008 21:03 Python License

Pour supporter des entiers de 64 bits pour les index de listes ou de chaîne, il a été nécessaire de changer les types de retour des primitives de l'interpréteur Python. Le nouveau type Py_ssize_t remplace int pour les types de retour des listes.

Un changement important de l'API C de Python est l'utilisation du nouveau type Py_ssize_t à la place de int, ce qui permettra à l'interpréteur de gérer plus de données sur les plateformes 64 bits. Ce changement n'affecte pas les capacités de Python sur les plateformes 32 bits.

De nombreuses partie de l'interpréteur Python utilisaient le type int de C pour stocker des tailles ou des compteurs, par exemple le nombre d'objet dans une liste ou un tuple était stocké dans un int. La plupart des compilateurs C pour plateforme 64 bits définissent l'int comme un type entier sur 32 bits, ce qui veut dire que les listes ne pouvait contenir que 2**31 - 1 = 2147483647 éléments. (Il y a en fait plusieurs modèles différents de programmation que les compilateurs C en 64 bits peuvent utiliser - voyez http://www.unix.org/version2/whatsnew/lp64_wp.html pour une discussion - mais les modèles les plus courants laissent le type int à 32 bits.)

Une limite de 2147483647 éléments dans un liste n'est pas très grave pour une plateforme 32 bits car vous serez à court de mémoire bien avant d'atteindre la limite. Chaque élément d'une liste utilise de l'espace mémoire pour une pointeur, soit 4 octets, plus de l'espace pour le PyObject représentant l'élément. 2147483647*4 est déjà trop grand pour ce que l'espace d'adressage 32 bits peut contenir.

Il est possible d'adresser bien plus de mémoire sur une plateforme 64 bits. Les pointeurs d'une liste de cette taille ne requiert que 16Go d'espace mémoire, il n'est pas déraisonnable de penser que les programmeurs Python pourrait construire des listes aussi large. Pour ce faire, l'interpréteur Python doit être modifié pour utiliser un autre type que int, et ce devrait être un type de 64 bits sur les plateforme 64 bits. Le changement causera des incompatibilités avec le code existant sur les machines 64 bits, si bien qu'il a été jugé intéressant de réaliser le changement maintenant pendant que le nombre d'utilisateurs utilisant 64 bits est relativement faible. (Dans 5 ou 10 ans, nous serons sans doute tous sur des machines 64 bits, et la transition serait alors difficile.)

Ce changement affecte surtout les les auteurs de module d'extension en C. Les chaînes de caractère et les types d'agrégat comme les listes et les tuples utilisent maintenant Py_ssize_t pour stocker leur taille. Les Fonctions tel que PyList_Size() retournent maintenant un Py_ssize_t. Le code des modules d'extensions doivent être changé pour que les variables concernées soit changé pour utiliser le type Py_ssize_t.

Les fonctions PyArg_ParseTuple() et Py_BuildValue() ont un nouveau code de conversion, "n", pour Py_ssize_t. Les "s#" et "t#" de PyArg_ParseTuple() renvoient toujours un int par défaut, mais vous pouvez définir la macro PY_SSIZE_T_CLEAN avant d'inclure Python.h pour leur faire retourner un Py_ssize_t.

PEP 353 à une section avec des guides de conversions que les auteurs d'extension devrait vraiment lire pour apprendre comment supporter les plateformes 64 bits.

Actions sur le document