如何从python的大型列表中删除曾经使用过的列表中的项目以节省内存?

时间:2018-09-17 03:48:56

标签: python python-3.x loops memory-management

如果我有一个运行着数百万个项目的大型列表,我想遍历每个项目。一旦我使用了该物品,就将不再使用它,那么,一旦使用,如何从列表中删除该物品?最好的方法是什么? 我知道numpy既快速又高效,但是想知道如何使用普通列表来完成。

mylst = [item1, item2,............millions of items]
for each_item in mylist:
    #use the item
    #delete the item to free that memory

3 个答案:

答案 0 :(得分:3)

您不能直接在Python中删除对象-当不再可能引用该对象时,该对象的内存将通过垃圾回收自动回收。只要对象 在列表中,以后就可以再次引用它(通过列表)。

因此,您也需要销毁该列表。例如,像这样:

while mylst:
    each_item = mylst.pop()  # removes an object from the end of the list
    # use the item

答案 1 :(得分:0)

假设您可以复制列表(此处可能会遇到内存限制),并且只需要从中删除特定元素,则可以创建列表的浅表副本,并在遍历原始列表时从中删除元素:

a_list = [1, 2, 3, 4, 5]
b_list = a_list.copy()
removal_key = 0
for element in a_list:
    if element % 2 == 0:
        b_list.pop(removal_key)
        removal_key -= 1; # we need to push the removal key back afer every deletion as our array b_list becomes smaller than the original after every deletion
    removal_key += 1
print(b_list) #[1, 3, 5]

如果不能创建第二个列表,则可以存储要从列表中删除的元素的键,然后使用第二个列表删除它们:

a_list = [1, 2, 3, 4, 5]
elements_to_remove = []
for key, element in enumerate(a_list):
    if element % 2 == 0:
        elements_to_remove.append(key)

removed_emelent_count = 0
for element in elements_to_remove:
    a_list.pop(element - removed_emelent_count)
    removed_emelent_count += 1
print(a_list) #[1, 3, 5]

请注意,第一种解决方案的时间效率更高(尤其是在删除大量元素时),而第二种解决方案的内存效率更高,尤其是在从列表中删除少量元素时。

答案 2 :(得分:0)

在这种情况下,您应该使用generators

生成器是一个函数,该函数使用特殊关键字yield而不是return返回一个可以一次迭代一个值的对象。 通过使每个迭代仅保留一个元素,它们可以使您的内存占用空间较小。

在python3.x中,range实际上是一个生成器(python2.x是xrange)。

过于简单的示例:

>>> def range(start, end):
...     current = start
...     while current < end:
...         yield current
...         current += 1
...
>>> for i in range(0, 2):
...     print(i)
...
0
1

这百万个条目列表是如何制作的?