Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sys.getsizeof()结果不';与结构尺寸不太相关_Python_Memory_Data Structures - Fatal编程技术网

Python sys.getsizeof()结果不';与结构尺寸不太相关

Python sys.getsizeof()结果不';与结构尺寸不太相关,python,memory,data-structures,Python,Memory,Data Structures,我正在尝试创建一个大小为1MB的列表。虽然以下代码有效: dummy = ['a' for i in xrange(0, 1024)] sys.getsizeof(dummy) Out[1]: 9032 以下代码不起作用 import os import sys dummy = [] dummy.append((os.urandom(1024)) sys.getsizeof(dummy) Out[1]: 104 有人能解释一下原因吗 如果您想知道为什么我不使用第一个代码段,那么我正在编写一

我正在尝试创建一个大小为1MB的列表。虽然以下代码有效:

dummy = ['a' for i in xrange(0, 1024)]
sys.getsizeof(dummy)
Out[1]: 9032
以下代码不起作用

import os
import sys

dummy = []
dummy.append((os.urandom(1024))
sys.getsizeof(dummy)
Out[1]: 104
有人能解释一下原因吗

如果您想知道为什么我不使用第一个代码段,那么我正在编写一个程序,通过编写一个for循环将块(大小为1b、1kb和1mb)写入内存来对内存进行基准测试

start = time.time() 
for i in xrange(1, (1024 * 10)):  
     dummy.append(os.urandom(1024)) #loop to write 1 MB blocks into memory
end = time.time()

如果检查列表的大小,它将提供列表数据结构的大小,包括指向其组成元素的指针。它不会考虑元素的大小。

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size
空列表的大小:
sys.getsizeof([])==72

添加一个元素:
sys.getsizeof([1])==80

添加另一个元素:
sys.getsizeof([1,1])==88

因此每个元素添加4个字节。
要获得1024字节,我们需要
(1024-72)/8=119
元素

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size
包含119个元素的列表的大小:
sys.getsizeof([None for i in xrange(0,119)])==1080

这是因为列表保留了一个额外的缓冲区来插入更多的项目,所以它不必每次都调整大小。(对于107到126之间的元素数量,大小与1080相同)

所以我们需要的是一个不可变的数据结构,它不需要保留这个缓冲区-
元组

empty_tuple_size = sys.getsizeof(())                     # 56
single_element_size = sys.getsizeof((1,))                # 64
pointer_size = single_element_size - empty_tuple_size    # 8
n_1mb = (1024 - empty_tuple_size) / pointer_size         # (1024 - 56) / 8 = 121
tuple_1mb = (1,) * n_1mb
sys.getsizeof(tuple_1mb) == 1024
因此,这是获得1MB数据结构的答案:
(1,)*121

但请注意,这只是元组和组成指针的大小。对于总大小,实际上需要将各个元素的大小相加

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size

备选方案:

sys.getsizeof('') == 37
sys.getsizeof('1') == 38     # each character adds 1 byte
对于1 MB,我们需要987个字符:

sys.getsizeof('1'*987) == 1024

这是实际大小,而不仅仅是指针的大小。

如果检查列表的大小,它将提供列表数据结构的大小,包括指向其组成元素的指针。它不会考虑元素的大小。

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size
空列表的大小:
sys.getsizeof([])==72

添加一个元素:
sys.getsizeof([1])==80

添加另一个元素:
sys.getsizeof([1,1])==88

因此每个元素添加4个字节。
要获得1024字节,我们需要
(1024-72)/8=119
元素

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size
包含119个元素的列表的大小:
sys.getsizeof([None for i in xrange(0,119)])==1080

这是因为列表保留了一个额外的缓冲区来插入更多的项目,所以它不必每次都调整大小。(对于107到126之间的元素数量,大小与1080相同)

所以我们需要的是一个不可变的数据结构,它不需要保留这个缓冲区-
元组

empty_tuple_size = sys.getsizeof(())                     # 56
single_element_size = sys.getsizeof((1,))                # 64
pointer_size = single_element_size - empty_tuple_size    # 8
n_1mb = (1024 - empty_tuple_size) / pointer_size         # (1024 - 56) / 8 = 121
tuple_1mb = (1,) * n_1mb
sys.getsizeof(tuple_1mb) == 1024
因此,这是获得1MB数据结构的答案:
(1,)*121

但请注意,这只是元组和组成指针的大小。对于总大小,实际上需要将各个元素的大小相加

str1_size = sys.getsizeof(['a' for i in xrange(0, 1024)])
str2_size = sys.getsizeof(['abc' for i in xrange(0, 1024)])
int_size = sys.getsizeof([123 for i in xrange(0, 1024)])
none_size = sys.getsizeof([None for i in xrange(0, 1024)])
str1_size == str2_size == int_size == none_size

备选方案:

sys.getsizeof('') == 37
sys.getsizeof('1') == 38     # each character adds 1 byte
对于1 MB,我们需要987个字符:

sys.getsizeof('1'*987) == 1024

这是实际的大小,而不仅仅是指针的大小。

也许这会有所帮助:
sys.getsizeof(b“a”*(1024-37))
除了代码之外,你不会得到一个合理的内存基准。Python对于这项任务来说是一个可怕的工具选择。也许它可以帮助:
sys.getsizeof(b“a”*(1024-37))
在代码旁边发生这么多其他事情时,你不会得到一个合理的内存基准。Python对于这项任务来说是一个可怕的工具选择。