Создать файл со всеми возможными комбинациями строк 0,1 большой длины без itertools - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу генерировать большие строки (до 1000) из 0 и 1 со всеми возможными комбинациями, без использования itertools. У меня есть код, который хорошо работает со строками длиной 20, но у меня проблемы с большими числами.

exponent=input("String length:")
n= int(exponent) #Convert to integer the input
#Define a function to get the calc
def combinations(n):
# If the length of the string is 0 just write "empty string".    
    if n < 1:              
        print("empty string")
    else:      
        for i in range(2**n):  
        # 2 raised to n power gives the total combinations        
            s = bin(i)[2:]
        # Bin converts to binary the number
            s = "0" * (n-len(s))+s
            print(s)

print(combinations(n))

Когда я пытаюсь с большими числами, такими как 50, я получаю следующее сообщение:

for i in range(2**n):
OverflowError: range() result has too many items

Есть ли у вас идеи, как улучшить мой код? Как я могу потратить меньше памяти, а также попробовать большие числа?

1 Ответ

0 голосов
/ 06 сентября 2018

Поскольку 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

Я не собираюсь ждать результатов.

...