2010-08-06 3 views
118

Il existe un type buffer en python, mais je ne sais pas comment l'utiliser.À quoi sert le type de tampon Python?

Dans le Python doc la description est la suivante:

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

L'argument de l'objet doit être un objet qui prend en charge l'interface d'appel de la mémoire tampon (tels que des chaînes, des tableaux et des tampons). Un nouvel objet tampon sera créé et fera référence à l'argument de l'objet. L'objet tampon sera une tranche à partir du début de l'objet (ou du 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épondre

120

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, en commençant à la position 6 d'une longueur de 5, il ne prend pas l'espace de stockage supplémentaire - il fait référence à une tranche de la chaîne.

Ceci 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 bytearray mutable:

>>> 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'un point de vue sur les données et ne veulent pas (ou ne peut pas) contenir plusieurs copies en mémoire.

Notez que buffer a été remplacé par le mieux nommé memoryview en Python 3, bien que vous puissiez l'utiliser soit en Python 2.7. Notez également que vous ne pouvez pas implémenter une interface tampon pour vos propres objets sans entrer dans l'API C, c'est-à-dire que vous ne pouvez pas le faire en pur Python.

+0

Merci pour votre explication. Mais je ne comprends toujours pas quelle est la différence entre la mise en tampon et le découpage simple. Utiliser 's [6:11]' ne prend pas plus d'espace de stockage non plus, ai-je tort? – satoru

+8

En général, une tranche prendra plus de mémoire, donc oui 's [6:11]' sera une copie. Si vous définissez 't = s [6:11]' puis 'del s', cela libère la mémoire qui a été prise par' s', ce qui prouve que 't' a été copié. (Pour voir cela, vous avez besoin d'un plus grand 's' et suivez l'utilisation de la mémoire de Python). Il est cependant beaucoup plus efficace de faire simplement la copie s'il n'y a pas beaucoup de données impliquées. –

+0

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

21

Je pense que les tampons sont par ex. utile lors de l'interfaçage de python avec des bibliothèques natives. (Guido van Rossum explique buffer dans this mailinglist post).

Par exemple, numpy semble utiliser le tampon pour le 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> 
+0

La liste de diffusion vaut certainement la peine d'être lue. – Robino