繁体   English   中英

在python中填写列表

[英]Filling up a list in python

我试图用python中名为A的字典中的值填充一个名为lines的字符串列表。A填充有整数。伪代码应该是这样的。

 for i in xrange(0,256):
    for j in xrange(0,768):
        lines[j+4+(512*3)*i]= str(A[i,j])

如您所见,我无法按行顺序插入元素。这可能吗? 如果是,那么我该怎么做? 列表行将非常大,大小为 786435。这取决于我和 jI,如果有人可以帮助我,我将非常感激。顺便说一句,我正在使用 python 2.7 。

列表是元素的连续序列。 您可以预先创建列表,在每个索引处存储对None的引用:

lines = [None] * (255 + 4 + (512 * 3) * 767)

但是随后您将创建一个包含 1,178,371(一百万多)个元素的对象。 这将需要相当数量的内存仅用于列表对象

>>> import sys
>>> sys.getsizeof([None] * 1178371)
9427040

仅列表对象就有 9MB,其中每个引用都指向同一个None对象(它是一个单例,内存中只有一个)。 添加字符串,内存需求快速攀升; 许多字符串需要 40+ MB:

>>> sys.getsizeof('') * 1178371
43599727

在 Python 2 中,每增加一个字符都会增加一个字节,因此将平均字符串长度乘以 1MB 添加到仅此列表的要求 如果您的字符串只有 3 个字符,那仍然可行; 总共大约 50MB,但如果您谈论的是 5000 个字符串,您很容易最终达到千兆字节。 5000 个字符并不是那么多。

但是,您的索引不是连续的。 您只生成 255 次 767 是 195585 个索引; 你似乎有一个稀疏的数据结构。 在这种情况下,您最好使用字典:

lines = {}
for i in xrange(0,256):
    for j in xrange(0,768):
        lines[j + 4 + (512 * 3) * i]= str(A[i, j])

这按书面方式工作,因为现在每个索引都是字典中的一个键。

如果您必须生成连续序列,请考虑不同的技术。 如果您的所有索引,从 0 到最后一个,都可以像上面那样计算,您可以通过计算来生成每个值; 给定一个索引,计算将放置在该索引处的字符串。 这样您就不必预先生成所有值。

上面的循环索引遵循特定的模式,因此您可以简单地从给定的索引中导出ij

def str_for_index(index):
    i = index // (512 * 3)
    j = (index % (512 * 3)) - 4
    if 0 <= i < 256 and 0 <= j < 768:
        return str(A[i, j])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM