Я хочу найти двоичные строки определенного веса.Количество таких строк увеличивается до точки ошибки памяти, поэтому в настоящее время я генерирую их с помощью генератора.Этот код генерирует всю длину n двоичных строк с весом k:
def kbits(n, k):
for bits in itertools.combinations(range(n), k):
s = ['0'] * n
for bit in bits:
s[bit] = '1'
yield ''.join(s)
for b in kbits(length, weight):
print(b)
Таким образом, для длины = 3 и веса = 2 мы получаем 110, 101, 011.
Мое исследование требует от меняпроанализируйте значения, такие как n = 56 и k = 7, что занимает около 24 часов на моем устройстве.Я также хотел бы попробовать n = 72 и k = 8, что (в зависимости от времени предыдущего результата) может занять 365 дней.Итак, мне интересно две вещи:
Является ли это самым быстрым (без памяти) интенсивным способом генерации этих двоичных строк?
Возможно ли иметь несколько ядер моего процессора, работающих на этом одновременно?Я предполагаю, что itertools анализирует последовательность.Если бы (скажем) у нас был двухъядерный процессор, было бы возможно, чтобы первое ядро анализировало первые 50% последовательности, а второе - для второй половины?
РЕДАКТИРОВАТЬ:
Возможно, я должен упомянуть, что для каждого логического b, я хотел бы выполнить следующие вычисления наименьших квадратов, где N - некоторая определенная матрица:
for b in kbits(size, max_coclique):
v = np.linalg.lstsq(N,np.array(list(b), dtype = float))
т.е.Мне требуется, чтобы конечный ожидаемый выходной формат для b был массивом numpy
со значениями 0/1.(Это если не существует какого-либо чрезвычайно быстрого способа сделать все это - включая вычисление наименьших квадратов - другим способом.)
Примечание: я также запускаю это в Sage, так как используюсвою базу данных переходных групп.