在处理python列表分配时最大限度地减少内存消耗
我有两个高维整数列表。每个列表的维度都超过200000。我的任务是这样的: 给出两个列表在处理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
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