在处理python列表分配时最大限度地减少内存消耗

在处理python列表分配时最大限度地减少内存消耗,python,algorithm,memory,Python,Algorithm,Memory,我有两个高维整数列表。每个列表的维度都超过200000。我的任务是这样的: 给出两个列表 a = [None, 0, None, None, 0, None, None, None, 0, None, None, None, None, None, 0,...] b = [7 1 4 8 2 1 1 1 1 6 1 6 1 4 4 1 1 6 6 7 4 4 7 5...] None的数量等于b的长度 我的问题是如何使用最小内存将a中的所有None替换为b中的每个元素 我的方法是 j = 0

我有两个高维整数列表。每个列表的维度都超过200000。我的任务是这样的: 给出两个列表

a = [None, 0, None, None, 0, None, None, None, 0, None, None, None, None, None, 0,...]
b = [7 1 4 8 2 1 1 1 1 6 1 6 1 4 4 1 1 6 6 7 4 4 7 5...]
None
的数量等于b的长度

我的问题是如何使用最小内存将
a
中的所有
None
替换为
b
中的每个元素

我的方法是

j = 0
for i in range(len(a)):
    if a[i] == None:
        while j < len(b):   
            a[i] = b[j]
            break
        j = j+1   
j=0
对于范围内的i(len(a)):
如果a[i]==无:
而j

由于我的程序占用内存很多,我真的需要节省内存使用。你能告诉我在这种情况下如何保存内存吗?

你可以从
b
生成一个迭代器,然后在列表理解中,如果
a
的当前元素是
None
,你可以
next(b_iter)
获取下一项

b_iter = iter(b)
a = [next(b_iter) if i is None else i for i in a]
例如

>>> a = [None, 0, None, None, 0, None, None, None, 0, None, None, None, None, None, 0]
>>> b = [7, 1, 4, 8, 2, 1, 1, 1, 1, 6, 1]
>>> b_iter = iter(b)
>>> [next(b_iter) if i is None else i for i in a]
[7, 0, 1, 4, 0, 8, 2, 1, 0, 1, 1, 1, 6, 1, 0]

为了检查内存,这个包可能会很有用,您使用的是哪种版本的Python,2还是3?如果这是Python2,那么应该使用
xrange
而不是
range
,因为这是代码中唯一使用大量内存的东西。当然,数组
a
b
也会占用内存,但由于这些都是输入,因此在本代码中无法避免。感谢您的友好回答。但是,你能解释一下为什么使用迭代器使内存消耗最小吗?@allenwang,因为迭代器一次只能访问一个元素。它不会创建列表的完整副本。它只是沿着一个序列遍历(或迭代),并在每次您请求一个元素时检索一个元素,在本例中使用函数
next