【问题标题】:When should one use BytesIO .getvalue() instead of .getbuffer()?什么时候应该使用 BytesIO .getvalue() 而不是 .getbuffer()?
【发布时间】:2020-04-20 09:49:42
【问题描述】:

根据BytesIO docs

getbuffer()

返回缓冲区内容的可读和可写视图,而不复制它们。此外,改变视图将透明地更新缓冲区的内容:

getvalue()

返回包含缓冲区全部内容的字节。

所以看起来getbuffer 似乎更复杂。但是如果你不需要一个可写的视图呢?然后你会简单地使用getvalue吗?有哪些取舍?

小例子

在这个例子中,他们似乎做的完全一样:

# Create an example
from io import BytesIO
bytesio_object = BytesIO(b"Hello World!")

# Write the stuff
with open("output.txt", "wb") as f:
    f.write(bytesio_object.getbuffer())

【问题讨论】:

  • 从这里的 cpython 代码github.com/python/cpython/blob/master/Modules/_io/bytesio.c 看来,当您调用 getvalue 时,似乎会调整内容缓冲区的大小以剥离额外的缓冲区空间(如果已分配),并且 getbuffer 将返回准备好修改的缓冲区,如果需要。
  • @Kris getvalue似乎比getbuffer快。如果 getvalue 每次都复制怎么办?另外,与getbuffer 不同,getvalue总是指向同一个底层对象

标签: python-3.x bytesio


【解决方案1】:

使用 getbuffer() 更好,因为如果你有非常大的数据,复制它们可能需要很长时间。并且(来自PEP 20):

显式优于隐式。
但是 value 是未定义的——它可能是 str 或 bytes。缓冲区总是字节。

【讨论】:

  • getvalue似乎比getbuffer快。如果 getvalue 每次都复制,那会怎样?另外,与getbuffer 不同,getvalue总是指向同一个底层对象
猜你喜欢
  • 2019-06-15
  • 2011-06-22
  • 2015-12-11
  • 2012-02-12
  • 2012-06-27
  • 2010-11-29
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多