python – 二进制流中`open`和`io.BytesIO`之间的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 二进制流中`open`和`io.BytesIO`之间的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2063字,纯文字阅读大概需要3分钟。
内容图文
我正在学习如何使用Python中的流,我注意到IO docs说了以下内容:
The easiest way to create a binary stream is with open() with ‘b’ in the mode string:
f = open("myfile.jpg", "rb")
In-memory binary streams are also available as BytesIO objects:
f = io.BytesIO(b"some initial binary data: \x00\x01")
由open定义的f和由BytesIO定义的f之间的区别是什么.换句话说,是什么构成了“内存中的二进制流”,它与open的不同之处是什么?
解决方法:
为简单起见,我们现在考虑写作而不是阅读.
所以当你使用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")
它不是将内容写入文件,而是写入内存缓冲区.换句话说,一块RAM.基本上写下以下内容将是等效的:
buffer = b""
buffer += b"Hello World"
buffer += b"Hello World"
buffer += b"Hello World"
关于带有with语句的示例,最后还会有一个del缓冲区.
这里的关键区别是优化和性能. io.BytesIO能够进行一些优化,使其比简单地逐个连接所有b“Hello World”更快.
只是为了证明它是一个小基准:
>康卡特: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()
内容总结
以上是互联网集市为您收集整理的python – 二进制流中`open`和`io.BytesIO`之间的区别全部内容,希望文章能够帮你解决python – 二进制流中`open`和`io.BytesIO`之间的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。