在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