Bri*_*Lee 4 python bytesio python-2.7
object.getbuffer().nbytes在 Python 3 中,我可以通过(where )获取 ByteIO 对象的大小,但在 Python 2 中object = ByteIO()最好的等效项是什么?getbuffer()经过一些探索,我发现我可以使用len(object.getvalue())or sys.getsizeof(object),但我不知道 Python 2 是否会接受它们。
请参阅下面的重要更新
在深入研究 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
Run Code Online (Sandbox Code Playgroud)
更新
在@admaster和@Artemis评论之后,我意识到,在预设缓冲区的情况下,正确的方法是将指针移动到缓冲区的末尾。标准seek函数可以做到这一点,它将报告当前缓冲区大小
buffsize = fd.seek(0,2)
Run Code Online (Sandbox Code Playgroud)
那么这里应该如何在没有不必要的应对记忆的情况下完成
from io import BytesIO
x = BytesIO(b'AAAAAA')
x.tell() # returns 0
x.seek(0,2) # returns 6
# However
x = BytesIO()
x.write(b'AAAAAA')
x.tell() # returns 6
x.seek(0,2) # returns 6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8752 次 |
| 最近记录: |