Ответ 1
Для простоты рассмотрим возможность записи вместо чтения на данный момент.
Итак, когда вы используете open()
, например, скажите:
with open("test.dat", "wb") as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
После выполнения будет создан файл с именем test.dat
, содержащий Hello World
. Данные не будут храниться в памяти после того, как они будут записаны в файл (если они не сохранены именем).
Теперь, когда вы считаете io.BytesIO()
:
with io.BytesIO() as f:
f.write(b"Hello World")
f.write(b"Hello World")
f.write(b"Hello World")
который вместо того, чтобы записывать содержимое в файл, записывается в буфер памяти. Другими словами, кусок ОЗУ. По существу, следующая запись будет эквивалентна:
buffer = b""
buffer += b"Hello World"
buffer += b"Hello World"
buffer += b"Hello World"
В отношении примера с оператором with, тогда в конце также будет del buffer
.
Основное отличие здесь - оптимизация и производительность. io.BytesIO
способен выполнять некоторые оптимизации, что делает его быстрее, чем просто объединение всех b"Hello World"
по очереди.
Просто, чтобы доказать это здесь небольшим эталоном:
- Concat: 1.3529 секунд
- BytesIO: 0.0090 секунд
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)
Помимо увеличения производительности при использовании BytesIO
вместо конкатенации. Возможно, что BytesIO
можно использовать вместо файлового объекта. Поэтому скажите, что у вас есть функция, ожидающая записи файлового объекта. Затем вы можете указать это в буфере памяти.
Когда дело доходит до open("myfile.jpg", "rb")
, который просто загружает и возвращает содержимое myfile.jpg
. Где BytesIO
снова просто буфер, содержащий некоторые данные.
Так как BytesIO
- это просто буфер, если вы хотите позже записать содержимое в файл, вам нужно будет:
buffer = io.BytesIO()
# ...
with open("test.dat", "wb") as f:
f.write(buffer.getvalue())
Кроме того, поскольку вы не упомянули о версии, я использую Python 3. Что касается примеров, просто я использую оператор with вместо вызова f.close()