我正在尝试用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.这取决于我和j。如果有人可以帮助我,我将非常有责任.BTW我使用的是python 2.7。
答案 0 :(得分:3)
列表是连续的元素序列。您可以预先创建列表,在每个索引处存储对None
的引用:
lines = [None] * (255 + 4 + (512 * 3) * 767)
但是你要创建一个包含1,178,371(100万多个)元素的对象。这只会为列表对象带来相当数量的内存:
>>> 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到最后)都可以像上面那样计算,则可以通过计算生成每个值;给定索引,计算将在该索引处放置的字符串。这样你就不必预先产生所有价值。
以上循环索引遵循特定模式,因此您只需从给定索引派生i
和j
:
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])