À quoi sert le type de tampon Python?


136

Il existe un buffertype en python, mais je ne sais pas comment puis-je l'utiliser.

Dans la documentation Python, la description est:

buffer(object[, offset[, size]])

L'argument objet doit être un objet prenant en charge l'interface d'appel de tampon (comme des chaînes, des tableaux et des tampons). Un nouvel objet tampon sera créé qui fait référence à l'argument objet. L'objet tampon sera une tranche depuis le début de l'objet (ou depuis le décalage spécifié). La tranche s'étendra jusqu'à la fin de l'objet (ou aura une longueur donnée par l'argument size).

Réponses:


145

Un exemple d'utilisation:

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

Le tampon dans ce cas est une sous-chaîne, commençant à la position 6 avec la longueur 5, et il ne prend pas d'espace de stockage supplémentaire - il fait référence à une tranche de la chaîne.

Ce n'est pas très utile pour les chaînes courtes comme celle-ci, mais cela peut être nécessaire lors de l'utilisation de grandes quantités de données. Cet exemple utilise un mutable bytearray:

>>> s = bytearray(1000000)   # a million zeroed bytes
>>> t = buffer(s, 1)         # slice cuts off the first byte
>>> s[1] = 5                 # set the second element in s
>>> t[0]                     # which is now also the first element in t!
'\x05'

Cela peut être très utile si vous voulez avoir plus d'une vue sur les données et que vous ne voulez pas (ou ne pouvez pas) conserver plusieurs copies en mémoire.

Notez qu'il buffera été remplacé par le mieux nommé memoryviewdans Python 3, bien que vous puissiez utiliser l'un ou l'autre dans Python 2.7.

Notez également que vous ne pouvez pas implémenter une interface tampon pour vos propres objets sans fouiller dans l'API C, c'est-à-dire que vous ne pouvez pas le faire en pur Python.


Merci pour votre explication. Mais je ne comprends toujours pas quelle est la différence entre la mise en mémoire tampon et le découpage simple. L'utilisation s[6:11]ne prend pas non plus d'espace de stockage supplémentaire, est-ce que je me trompe?
satoru

9
En général, une tranche prendra un stockage supplémentaire, donc oui s[6:11]sera une copie. Si vous définissez t = s[6:11]et ensuite del s, cela libère la mémoire qui a été prise s, prouvant qu'elle a tété copiée. (Pour voir cela, vous avez besoin d'un plus grand set d'un suivi de l'utilisation de la mémoire de Python). Il est cependant beaucoup plus efficace de simplement faire la copie s'il n'y a pas beaucoup de données impliquées.
Scott Griffiths

1
Merci beaucoup :) BTW, pourriez-vous s'il vous plaît me dire quel outil puis-je utiliser pour suivre l'utilisation de la mémoire de Python?
satoru

Pour l'utilisation de la mémoire, consultez stackoverflow.com/questions/110259 par exemple. Parfois, il est plus simple de regarder l'utilisation de Python dans le Gestionnaire de tâches / Moniteur d'activité / top.
Scott Griffiths

13
Pour les noobs Python comme moi: le tampon est une vue de la mémoire dans Python 3
Dirk Bester

25

Je pense que les tampons sont par exemple utiles lors de l'interfaçage de python avec des bibliothèques natives. (Guido van Rossum explique bufferdans cet article de liste de diffusion ).

Par exemple, numpy semble utiliser un tampon pour un stockage efficace des données:

import numpy
a = numpy.ndarray(1000000)

le a.dataest un:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.