Par souci de simplicité, nous allons envisager d'écrire au lieu de lire pour l'instant.
Ainsi, lorsque vous utilisez open()
comme le disent:
with open("test.dat", "wb") as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
Après l'exécution d'un fichier appelé test.dat
sera créé, contenant Hello World
. Les données ne seront pas conservées en mémoire une fois que c'est écrit dans le fichier (à moins d'être gardé par un nom).
Maintenant, quand vous considérez io.BytesIO()
à la place:
with io.BytesIO() as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
Qui, au lieu d'écrire le contenu d'un fichier, il est écrit dans une mémoire tampon. En d'autres termes, une partie de la RAM. Essentiellement de l'écriture de la suite serait l'équivalent:
buffer = b""
buffer += b"Hello World"
buffer += b"Hello World"
buffer += b"Hello World"
Par rapport à l'exemple avec l'instruction, puis à la fin il y aurait aussi un del buffer
.
La principale différence ici est de l'optimisation et de la performance. io.BytesIO
est capable de faire quelques optimisations qui le rend plus rapide que de simplement la concaténation de tous les b"Hello World"
, un par un.
Juste pour le prouver, voici un petit indice:
- Concat: 1.3529 secondes
- BytesIO: 0.0090 secondes
import io
import time
begin = time.time()
buffer = b""
for i in range(0, 50000):
buffer += b"Hello World"
end = time.time()
seconds = end - begin
print("Concat:", seconds)
begin = time.time()
buffer = io.BytesIO()
for i in range(0, 50000):
buffer.write(b"Hello World")
end = time.time()
seconds = end - begin
print("BytesIO:", seconds)
Outre le gain de performance, à l'aide de BytesIO
au lieu de concaténer a l'avantage d' BytesIO
peut être utilisé à la place d'un fichier objet. Donc, disons que vous avez une fonction qui attend un objet fichier à écrire. Ensuite, vous pouvez lui donner un tampon en mémoire au lieu d'un fichier.
La différence est que, open("myfile.jpg", "rb")
simplement charges et retourne le contenu de l' myfile.jpg
; considérant que, BytesIO
nouveau est à seulement un tampon contenant des données.
Depuis BytesIO
est à seulement un tampon - si vous souhaitez écrire le contenu d'un fichier plus tard - que vous avez à faire:
buffer = io.BytesIO()
# ...
with open("test.dat", "wb") as f:
f.write(buffer.getvalue())
Aussi, vous n'avez pas mentionné une version; je suis à l'aide de Python 3. Liées à la exemples: je suis l'aide de la déclaration au lieu de l'appeler f.close()