Entiers courts en Python
Python alloue des entiers automatiquement, basée sur le système sous-jacent de l'architecture. Malheureusement, j'ai un énorme jeu de données qui doit être entièrement chargé en mémoire.
Alors, est-il un moyen de forcer Python pour utiliser seulement 2 octets pour certains entiers (l'équivalent de C++ "court")?
Si vous êtes en train de faire toute sorte de manipulation de cet immense jeu de données, vous souhaiterez probablement utiliser Numpy, qui a en charge une large variété de types numériques, et l'efficacité des opérations sur les tableaux de.
juste un heads-up: C++'s court pas les 2 octets de largeur. Il est dépendant de l'implémentation.
juste un heads-up: C++'s court pas les 2 octets de largeur. Il est dépendant de l'implémentation.
OriginalL'auteur Arnav | 2008-09-23
Vous devez vous connecter pour publier un commentaire.
Nope. Mais vous pouvez utiliser des entiers courts dans des matrices:
Tant que la valeur reste dans ce tableau, il sera un entier court.
Donc, est un array('h') avec un seul élément, de même que la création d'un entier court?
nope. que serait un PyObject + un entier court.
OriginalL'auteur Armin Ronacher
Grâce à Armin pour souligner le "tableau" du module. J'ai aussi trouvé le 'struct' module packs de style c structs dans une chaîne de caractères:
À partir de la documentation (https://docs.python.org/library/struct.html):
OriginalL'auteur Arnav
Armin la suggestion de la matrice module est probablement le meilleur. Deux solutions possibles:
c'est assez simple à faire.
tromper et manipuler des bits, de sorte que
vous voulez enregistrer un numéro dans la
la moitié inférieure du Python de type int, et
un autre dans la moitié supérieure.
Vous voulez écrire certaines fonctions de l'utilitaire de
pour convertir vers/à partir de ces au sein de votre
structure de données. Laid, mais il peut être fait au travail.
Il est également important de réaliser qu'un Python entier de l'objet n'est pas de 4 octets - il y a une charge supplémentaire. Donc, si vous avez un très grand nombre de courts-métrages, puis vous pouvez enregistrer plus de deux octets par numéro en utilisant un C court, d'une certaine façon (par exemple, le tableau du module).
Je devais garder un grand ensemble d'entiers en mémoire un certain temps il ya, et d'un dictionnaire entier avec des clés et des valeurs était trop grand (j'avais 1 go de disponible pour la structure de données IIRC). Je suis passé à l'aide d'un IIBTree (à partir de la ZODB) et a réussi à s'intégrer. (Les services de renseignements dans un IIBTree sont de vrais C ints, pas Python entiers, et j'ai piraté un passage automatique à un IOBTree lorsque le nombre était de plus de 32 bits).
Il suffit d'installer la ZODB (pypi.python.org/pypi/ZODB3/3.8.0). Un IOBTree est un Arbre qui a entier touches (I) et des valeurs de l'objet (O).
OriginalL'auteur Tony Meyer