如何创建一个空的2 d列表或大小以兆字节为单位的列表列表。

时间:2017-03-21 12:13:32

标签: python list

如何创建一个空的2 d列表或大小以兆字节为单位的列表列表。主要目的是它可以在Mbs中存储数据,但在迭代时它不应该处理空的子子列表。

1 个答案:

答案 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来衡量该列表中所有内容的大小(其中的对象是masterstrset,{{1} },或list,或这些类的任意组合。)

正如你所看到的,你自己的解释和调整有很多空间,但这应该会给你一个良好的开端。