Эффективные по памяти альтернативы в python для пустого списка и добавления? - PullRequest
0 голосов
/ 21 марта 2020

У меня довольно большой набор данных, который я использую в python, и использование списков слишком неэффективно для памяти.

Псевдокод подобен следующему:

thelist = []
for x in range(N):
    value = function_call()
    thelist.append(value)

more = separate_function_call()

thelist.append(more)

Я делаю стандартный подход инициализации пустого списка, а затем добавляю элементы в этот список, используя итерацию по вызовам функций, плюс вывод отдельного вызова функции.

Моя проблема в том, что списки слишком велики, чтобы уместиться в память.

Обычно, это было бы ясным случаем для генераторов, например

import sys
list_comp = [x ** 2 for x in range(5000) if x % 2 == 0]
gen_exp = (x ** 2 for x in range(5000) if x % 2 == 0)
sys.getsizeof(list_comp)
## 21040
sys.getsizeof(gen_exp)
## 112

Однако я не уверен, как это работает в приведенном выше примере, так как я не знаю, как хранить элементы в такой структуре данных, за исключением использования списка.

Какие есть альтернативы хранению предметов в таком огромном списке, как этот?

1 Ответ

1 голос
/ 21 марта 2020

Вот как вы можете создать функцию генератора для эффективной итерации по объектам, у которых в памяти одновременно только один объект:

def my_generator(N):
    for x in range(N):
        yield function_call()
    yield another_function_call()

for item in my_generator(1000): # or whatever N
    do_stuff(item)
...