gpt4 book ai didi

python如何获取BytesIO分配的内存长度?

转载 作者:太空狗 更新时间:2023-10-29 16:53:04 26 4
gpt4 key购买 nike

这是我用来测试内存分配的代码

import pycurl
import io


url = "http://www.stackoverflow.com"
buf = io.BytesIO()


print(len(buf.getvalue())) #here i am getting 0 as length


c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.CONNECTTIMEOUT, 10)
c.setopt(c.TIMEOUT, 10)
c.setopt(c.ENCODING, 'gzip')
c.setopt(c.FOLLOWLOCATION, True)
c.setopt(c.IPRESOLVE, c.IPRESOLVE_V4)
c.setopt(c.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()
c.close()

print(len(buf.getvalue())) #here length of the dowloaded file


print(buf.getvalue())
buf.close()

如何通过 BytesIO 获取分配的缓冲区/内存长度?我在这里做错了什么? python 不分配固定的缓冲区长度?

最佳答案

我不确定你所说的分配的缓冲区/内存长度是什么意思,但是如果你想将用户数据的长度存储在 BytesIO 对象中,你可以这样做

>>> bio = io.BytesIO()
>>> bio.getbuffer().nbytes
0
>>> bio.write(b'here is some data')
17
>>> bio.getbuffer().nbytes
17

但这似乎等同于您当前使用的 len(buf.getvalue())

可以使用 sys.getsizeof() 找到 BytesIO 对象的实际大小:

>>> bio = io.BytesIO()
>>> sys.getsizeof(bio)
104

或者你可以很讨厌并直接调用 __sizeof__()(这类似于 sys.getsizeof() 但没有适用于对象的垃圾收集器开销):

>>> bio = io.BytesIO()
>>> bio.__sizeof__()
72

BytesIO 的内 stub 据需要分配,并且确实发生了一些缓冲:

>>> bio = io.BytesIO()
>>> for i in range(20):
... _=bio.write(b'a')
... print(bio.getbuffer().nbytes, sys.getsizeof(bio), bio.__sizeof__())
...
1 106 74
2 106 74
3 108 76
4 108 76
5 110 78
6 110 78
7 112 80
8 112 80
9 120 88
10 120 88
11 120 88
12 120 88
13 120 88
14 120 88
15 120 88
16 120 88
17 129 97
18 129 97
19 129 97
20 129 97

关于python如何获取BytesIO分配的内存长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com