Как удалить элемент из списка, который когда-то использовался, из большого списка в python для экономии памяти? - PullRequest
0 голосов
/ 17 сентября 2018

Если у меня большой список, состоящий из миллионов элементов, я хочу перебрать каждый из них.Как только я использую элемент, он никогда не будет использоваться снова, так как я могу удалить элемент из списка после его использования?Каков наилучший подход?Я знаю, что numpy - это быстро и эффективно, но я хочу знать, как это можно сделать с помощью обычного списка.

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

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Предполагая, что вы можете скопировать список (ограничения памяти могут вызвать проблемы здесь) и вам нужно только удалить из него определенные элементы, вы можете создать поверхностную копию списка и удалить элементы из него, повторяя при этом исходный список:

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]

Если создание 2-го списка не вариант, вы можете сохранить ключи элементов, которые должны быть удалены из списка, а затем использовать второй список для их удаления:

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]

Обратите внимание, что первое решение более эффективно по времени (особенно при удалении большого количества элементов), тогда как второе решение более эффективно по памяти, особенно при удалении небольшого количества элементов из списка.

0 голосов
/ 17 сентября 2018

Это, вероятно, тот случай, когда вы должны использовать генераторы .

Генератор - это функция, которая возвращает объект, который мы можем перебрать, по одному значению за раз, используяспециальное ключевое слово 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

Как составлен этот миллион записей?

0 голосов
/ 17 сентября 2018

Вы не можете удалить объект непосредственно в Python - память объекта автоматически восстанавливается сборщиком мусора, когда уже невозможно ссылаться на объект.До тех пор, пока объект находится в списке , на него можно будет снова ссылаться позже (через список).

Так что вам также необходимо уничтожить список.Например, вот так:

while mylst:
    each_item = mylst.pop()  # removes an object from the end of the list
    # use the item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...