Поскольку range
захватывает слишком много памяти, просто создайте свой цикл итерации:
i = 0
limit = 2**(n+1) - 1
while i <= limit:
print(bin(i)[2:].zfill(n))
i += 1
Обратите внимание, что вы все еще ограничены вселенной с примерно 10 ^ 79 частицами (около 2 ^ 263). Перед тем, как положить большое число, time
меньший регистр, а затем вычислите, сколько времени займет печать вашего большого.
На своем настольном монстре я могу напечатать всю строку длиной 20 всего за 45 секунд. Увеличив это, я смогу справиться с твоей желаемой длиной 1000 дюймов ...
45 * 2**(1000-20) sec
= 2**5.5 * 2**980 sec
= 2**985.5 sec
Теперь в веке около 2 ^ 31,5 секунд ...
= 2**(985.5 - 31.5) centuries
= 2**954 centuries
Или, глядя на это по-другому, я могу произвести вывод всех строк длиной 46 всего за один век. Выполнение вашего «маленького» случая 50 закончится где-то около 3600 года нашей эры на моем экране.
Даже если предположить более быстрый метод рендеринга, мы не решаем вашу "большую" проблему. Моя текущая скорость печати этих двоичных файлов с 20 символами составляет всего 23 КБ (2 ^ 14,5) в секунду. Давайте установим машину несколько быстрее моего настольного монстра, скажем, машину с частотой 1000 ГГц, которая генерирует новую строку каждый такт. Это 2 ^ 40 строк / сек.
О, боже! Теперь, с идеальной скоростью рендеринга, мы можем сделать 50-символьную работу за 2 ^ 10 секунд, или только 17 минут вместо 16 веков. Это влечет за собой полную работу в 1000 символов до
= 2**960 sec
= 2**(960 - 31.5) centuries
= 2**928.5 centuries
Я не собираюсь ждать результатов.