Следующий код дает сбой из-за 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))])