À quoi sert le type de tampon Python?

il y a un type buffer en python, mais je ne sais pas comment l'utiliser.

dans le Python doc la description est:

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

l'argument object doit être un objet qui supporte l'interface d'appel de buffer (comme les chaînes, les tableaux et les tampons). Un nouvel objet buffer sera créé qui fait référence à l'argument object. L'objet buffer sera une tranche à partir du début de l'objet (ou du décalage spécifié). La tranche prolongera jusqu'à la fin de l'objet (ou aura une longueur donnée par la taille de l'argument).

122
demandé sur Arjun J Rao 2010-08-06 13:55:44

2 réponses

un exemple d'usage:

>>> 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 en 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 des 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 ne veulent pas (ou ne peut) contenir plusieurs copies en mémoire.

notez que buffer a été remplacé par le plus nommé memoryview en Python 3, bien que vous puissiez utiliser l'un ou l'autre en python 2.7.

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

125
répondu Scott Griffiths 2016-08-06 15:17:18

je pense que les tampons sont par exemple utiles pour interfacer python avec les bibliothèques natives. (Guido van Rossum, explique buffer dans cette liste de diffusion post ).

par exemple, numpy semble utiliser un tampon pour un stockage de données efficace:

import numpy
a = numpy.ndarray(1000000)

le a.data est un:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
21
répondu Andre Holzner 2017-04-25 07:25:31