Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

386
Visualizações
Diferencia entre `open` y `io.BytesIO` en flujos binarios

Estoy aprendiendo a trabajar con transmisiones en Python y noté que los documentos de IO dicen lo siguiente:

La forma más fácil de crear un flujo binario es con open() con 'b' en la cadena de modo:

f = open("myfile.jpg", "rb")

Los flujos binarios en memoria también están disponibles como objetos BytesIO:

f = io.BytesIO(b"some initial binary data: \x00\x01")

¿Cuál es la diferencia entre f definida por open y f definida por BytesIO . En otras palabras, ¿qué hace un "flujo binario en memoria" y en qué se diferencia de lo que hace open ?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

En aras de la simplicidad, consideremos escribir en lugar de leer por ahora.

Entonces, cuando usas open() como decir:

 with open("test.dat", "wb") as f: f.write(b"Hello World") f.write(b"Hello World") f.write(b"Hello World")

Después de ejecutar eso, se creará un archivo llamado test.dat , que contiene 3x Hello World . Los datos no se guardarán en la memoria después de que se escriban en el archivo (a menos que se guarden con un nombre).

Ahora, cuando considere io.BytesIO() en su lugar:

 with io.BytesIO() as f: f.write(b"Hello World") f.write(b"Hello World") f.write(b"Hello World")

Que en lugar de escribir el contenido en un archivo, se escribe en un búfer de memoria. En otras palabras, una porción de RAM. Esencialmente, escribir lo siguiente sería el equivalente:

 buffer = b"" buffer += b"Hello World" buffer += b"Hello World" buffer += b"Hello World"

En relación con el ejemplo con la instrucción with, al final también habría un del buffer .

La diferencia clave aquí es la optimización y el rendimiento. io.BytesIO puede hacer algunas optimizaciones que lo hacen más rápido que simplemente concatenar todos los b"Hello World" uno por uno.

Solo para probarlo, aquí hay un pequeño punto de referencia:

  • Concat: 1.3529 segundos
  • BytesIO: 0.0090 segundos

 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)

Además de la ganancia de rendimiento, usar BytesIO en lugar de concatenar tiene la ventaja de que BytesIO se puede usar en lugar de un objeto de archivo. Supongamos que tiene una función que espera que se escriba un objeto de archivo. Entonces puede darle ese búfer en memoria en lugar de un archivo.

La diferencia es que open("myfile.jpg", "rb") simplemente carga y devuelve el contenido de myfile.jpg ; mientras que BytesIO nuevamente es solo un búfer que contiene algunos datos.

Dado que BytesIO es solo un búfer, si quisiera escribir el contenido en un archivo más tarde, tendría que hacer lo siguiente:

 buffer = io.BytesIO() # ... with open("test.dat", "wb") as f: f.write(buffer.getvalue())

Además, no mencionaste una versión; Estoy usando Python 3. Relacionado con los ejemplos: estoy usando la instrucción with en lugar de llamar a f.close()

over 4 years ago · Santiago Trujillo Relatório

0

El uso open abre un archivo en su disco duro. Según el modo que utilice, puede leer o escribir (o ambos) desde el disco.

Un objeto BytesIO no está asociado con ningún archivo real en el disco. Es solo una porción de memoria que se comporta como un archivo. Tiene la misma API que un objeto de archivo devuelto desde open (con modo r+b , que permite leer y escribir datos binarios).

BytesIO (y su hermano cercano StringIO que siempre está en modo de texto) puede ser útil cuando necesita pasar datos hacia o desde una API que espera recibir un objeto de archivo, pero donde preferiría pasar los datos directamente. Puede cargar los datos de entrada que tiene en BytesIO antes de dárselos a la biblioteca. Después de que regrese, puede obtener cualquier dato que la biblioteca haya escrito en el archivo desde BytesIO usando el método getvalue() . (Por lo general, solo necesitaría hacer uno de esos, por supuesto).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda