如何创建一个空的2 d列表或大小以兆字节为单位的列表列表。主要目的是它可以在Mbs中存储数据,但在迭代时它不应该处理空的子子列表。
答案 0 :(得分:0)
听起来你想要一个这样的数据结构:[[], [], []]
,最终。我们称之为最终数据结构master
。有两种方法可以解释您的问题:
1)仅master
本身的“大小”(而不是它所引用的对象)应为 n 兆字节。
2)master
的大小加上其中包含的每个对象的大小应为 n 兆字节。
这是两个略有不同的问题。如果您只想将空列表添加到master
,直到 master
的大小达到 n MB,那么您可以执行以下操作。< / p>
def init_empty_array(mb):
byte = mb*(10**6)
master = []
size = getsizeof(master)
while size < byte:
master.append([])
size = getsizeof(master)
return master
sys.getsizeof
以字节为单位返回对象的大小,这就是我们将传递的mb
(兆字节)参数转换为字节的原因。然后我们创建一个空的“主”列表并获取其大小(在Python中为64字节)。之后,我们只需添加master
个空列表,直到达到所需的大小。您实际上只需将size
作为64启动,然后为每个其他列表添加8,而不是使用sys.getsizeof
。
但请注意,master
的最终尺寸可能与将 k 列表附加到master
时所需的尺寸不一致。那是因为sys.getsizeof
仅测量master
本身的大小,而不是其中包含的列表。考虑一下:
>>> from sys import getsizeof
>>> getsizeof([])
64
>>> getsizeof([[]])
72
好吧,看看那个。 []
(空列表)的大小(以字节为单位)为64字节。如果我们在以前空列表中嵌套一个空列表,请调用外部列表arr
,然后arr
的大小变为72.每个附加对象(str
,{{1}添加到list
的},set
等添加8个字节到arr
的大小。但是技术上仍然是arr
内的空列表,对吗?是否要考虑主列表中每个空列表的大小(64字节)取决于您。
要获得[[]]
的大小和其中包含的对象,您可以尝试这样的事情:
master
我们为附加列表添加64个字节,并为该列表中添加到def init_empty_array(mb):
byte = mb*(10**6)
master = []
size = 64
while size < byte:
master.append([])
size += 64 + 8
return master
的附加大小添加8个字节。
请注意,根据您传递的兆字节数(例如2.53与2.0),您的最终master
列表可能完全 master
的大小你传递的那个(那是因为我们不能附加一小部分列表;它是64字节或者没有)。
根据mb
是严格的上限还是下限,您可以调整mb
大小下降的位置(即在那里添加一些模数运算以查找最大或最小列表数给定的兆字节数。)
并且,假设您希望用任何填充列表,直到其大小达到 n MB。您可以使用递归内存占用函数here来衡量该列表中所有内容的大小(其中的对象是master
,str
,set
,{{1} },或list
,或这些类的任意组合。)
正如你所看到的,你自己的解释和调整有很多空间,但这应该会给你一个良好的开端。