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 buffer
a été remplacé par le mieux nommé memoryview
dans 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.
s[6:11]
ne prend pas non plus d'espace de stockage supplémentaire, est-ce que je me trompe?s[6:11]
sera une copie. Si vous définissezt = s[6:11]
et ensuitedel s
, cela libère la mémoire qui a été prises
, prouvant qu'elle at
été copiée. (Pour voir cela, vous avez besoin d'un plus grands
et 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.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
buffer
dans cet article de liste de diffusion ).Par exemple, numpy semble utiliser un tampon pour un stockage efficace des données:
le
a.data
est un:la source