的GetBuffer的等效BytesIO在Python 2(equivalent of getbuf

2019-09-28 07:19发布

在Python 3,我可以通过ByteIO对象的大小object.getbuffer().nbytes (其中object = ByteIO()但什么是最好等同getbuffer()在Python 2? 做了一些探索,我发现我可以使用len(object.getvalue())sys.getsizeof(object) ,但我不知道是否Python的2愿意接受他们。

Answer 1:

在Python 2.7的源代码挖后,我发现了一个简单的解决方案:因为io.BytesIO()返回一个文件描述符,它有一组标准的功能,包括tell()

需要注意的是间接方法诸如len(fd.getvalue())fd.getbuffer().nbytes复制缓冲区出来,然后计算缓冲区大小。 在我的情况下,当缓冲器保持的存储器的1/2,这最终作为一个应用程序崩溃:/

相反fd.tell()只报告描述符的当前位置,并且不需要任何内存分配!

注意,这两个sys.getsizeof(fd) fd.__sizeof__() 返回正确的缓冲溶液的大小。

>>> from io  import BytesIO
>>> from sys import getsizeof
>>> with BytesIO() as fd:              
...  for x in xrange(200):
...   fd.write(" ")
...   print fd.tell(), fd.__sizeof__(), getsizeof(fd)
1 66 98
2 66 98
3 68 100
4 68 100
5 70 102
6 70 102
.....
194 265 297
195 265 297
196 265 297
197 265 297
198 265 297
199 265 297
200 265 297


Answer 2:

您可以使用getvalue()

例:

from io import BytesIO
if __name__ == "__main__":
    out = BytesIO()
    out.write(b"test\0")
    print len(out.getvalue())

请参阅: https://docs.python.org/2/library/io.html#io.BytesIO.getvalue



文章来源: equivalent of getbuffer for BytesIO in Python 2