Способ отработать itertools в forloop, чтобы остановить MemoryError - PullRequest
0 голосов
/ 31 марта 2019

Следующий код дает сбой из-за MemoryError. Я считаю, что это потому, что он рассчитывает часть itertools за один раз. Возможно ли, чтобы itertools вычислял себя вместе с моими циклами for, чтобы избежать заполнения моей оперативной памяти.

(или это единственный вариант получить компьютер побольше!)

Пожалуйста, сообщите -


N = 8
a = TWFclass(N)
b = []
c = np.zeros_like(a.TWFm)
for i in np.array(list(itertools.product(range(N), repeat=int(N*np.log2(N))))):
    a.change(i.reshape(N, int(np.log2(N))))
    if a.check(16):
        b.append(a.TWFm)

Немного информации о коде:

- оператор itertools генерирует числа для матрицы a.TWFm

- это присваивается a.TWFm через функцию .change

-. Функция проверки возвращает true или false из некоторого вычисления, добавляя его в список b для последующего анализа


РЕДАКТИРОВАТЬ (ответы на комментарии)

комментарий 1)

np.array требуется список? Это не займет то, что itertools.product вернет?

itertools должен иметь список для распаковки / что угодно (т.е. перетаскивание значений из объекта), так как отсутствие списка приводит к ошибке TypeError: iteration over a 0-d array

комментарий 2)

Я почти уверен, что у вас не может быть "ленивого" массива; даете ли вы ему список или (даже если поддерживается) генератор в качестве аргумента, результирующий массив будет иметь все данные в памяти (хотя и хранится как можно более компактно).

Я могу понять вашу точку зрения, если я немного изменю свой вопрос, чтобы сказать, что я знаю, что у меня есть цикл for, который длится x = N ** (log2 (N) * N), знаете ли вы, itertools позволяет вам работать один itertools.product номера петли х? Надеюсь, что это имеет смысл ...

комментарий 3)

Просто любопытно ... что такое TWFclass и TFWm? Твои занятия? Часть библиотеки я не знаю?

Нет, это мой собственный класс, где TWFm - это матрица (N, log2 (N)), а TWFclass - это имя класса ...

т.е. у меня есть

class TWFclass(N):
    def __init__(self, N):
        self.N = N
        self.TWFm = np.zeros([self.N, int(np.log2(self.N))])

1 Ответ

1 голос
/ 31 марта 2019

Зачем преобразовывать итератор в массив или список, если вы все равно используете его поэлементно?

Следующее должно работать так же хорошо:

for i in itertools.product(range(N), repeat=int(N*np.log2(N))):
    ...
...