Почему python зацикливается и занимает до 40% моего процессора? - PullRequest
0 голосов
/ 02 декабря 2019

Я тестировал некоторый код, и по какой-то причине python не может добраться до конца кода, занимая до 40% моего процессора.

import random

input_text = input('Testo > ')
key = ''
output_text = ''
cond_1 = ''

alfabeto = list("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM 1234567890èéòç@à°#ù§[]+*,;.:-_<>£$₽%&()=?ì^/|!ėëęēêĖËĘĒÉÈÊūûüúŪÛÜÚÙīïįíìîĪÏĮÍÌκōøõœöôóŌØÕŒÖÓÒãåāáâäæÃÅĀªÀÁÂÄÆßẞÇñÑ¥¢∆¶×÷π√•`~©®™✓йцукенгшщзхфывапролджэячсмитьбюЙЦУКЕНГШЩЗХФЫВАПРОЛДЖЭЯЧСМИТЬБЮ⌂☻‼‰╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤▬╥╙╘╒╓╫╪┘┌¤█▄▌▐▀αΣσ░▒▓│┤╡╢╖╕╣║╗╝¿þ¼½¾ⁿ⌠⌡≤≥±≡∩∞ΘΩð«»⌐¬¨↨↑↓→←↔₧☼♥♦♣♠♂♀♪◘○◙►◄▲▼Þ‘’“”„")
numeri = ''

for _ in range(len(alfabeto)):
    while True:
        checked = str(random.randint(2,len(alfabeto)))
        if '0' in checked or '1' in checked or checked in cond_1:
            pass
        else:
            cond_1 += f'{checked} '
            break
    cont = list(checked)
    cont = '0'.join(cont)
    numeri += f'{cont}1'

print(numeri, len(numeri), len(alfabeto))

РЕДАКТИРОВАТЬ: глядя на ответы яизменил мой код для решения проблемы, вот он

import random

input_text = input('Testo > ')
key = ''
output_text = ''
cond_1 = ''

alfabeto = list("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM 1234567890èéòç@à°#ù§[]+*,;.:-_<>£$₽%&()=?ì^/|!ėëęēêĖËĘĒÉÈÊūûüúŪÛÜÚÙīïįíìîĪÏĮÍÌκōøõœöôóŌØÕŒÖÓÒãåāáâäæÃÅĀªÀÁÂÄÆßẞÇñÑ¥¢∆¶×÷π√•`~©®™✓йцукенгшщзхфывапролджэячсмитьбюЙЦУКЕНГШЩЗХФЫВАПРОЛДЖЭЯЧСМИТЬБЮ⌂☻‼‰╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤▬╥╙╘╒╓╫╪┘┌¤█▄▌▐▀αΣσ░▒▓│┤╡╢╖╕╣║╗╝¿þ¼½¾ⁿ⌠⌡≤≥±≡∩∞ΘΩð«»⌐¬¨↨↑↓→←↔₧☼♥♦♣♠♂♀♪◘○◙►◄▲▼Þ‘’“”„")
numeri = ''

for _ in range(len(alfabeto)):
    while True:
        checked = str(random.randint(2,2000))
        if '0' in checked or '1' in checked or checked in cond_1:
            pass
        else:
            cond_1 += f'{checked} '
            break
    cont = list(checked)
    cont = '0'.join(cont)
    numeri += f'{cont}1'

print(numeri, len(numeri), len(alfabeto))

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

если мы немного изменим код, мы увидим, почему это никогда не заканчивается. Я начинаю с вытягивания части внутреннего цикла while в функцию, которая генерирует все возможные значения:

def option_gen(n):
    for i in range(2, n):
        s = str(i)
        if '0' in s or '1' in s:
            continue
        yield s

options = list(option_gen(len(alfabeto)))

, которая имеет 160 значений, и, как заметил Томерику, это намного меньше, чем 351 значение в вашемсписок. следовательно, ваш цикл while будет вращаться через некоторое время, добавляя новые значения в постоянно растущую строку cond_1, тогда просто ничего не делая.

мы можем использовать эту функцию, чтобы написать более эффективную версию, которая вместо этого дает гораздо более быстрый сбойвместо того, чтобы расходиться:

from random import shuffle

random.shuffle(options)

result = []
for _ in range(len(alfabeto)+3):
    cont = '0'.join(list(options.pop()))
    result.append(cont + '1')

numeri = ''.join(result)

через некоторое время это вызовет полезное исключение, объясняющее, почему он не может продвигаться вперед. Также обратите внимание, что выполнение цикла for только над чем-то вроде range(5) завершит

0 голосов
/ 02 декабря 2019

После добавления отладки в ваш код

checked = str(random.randint(2,len(alfabeto)))
print('checked ' + checked)
if '0' in checked or '1' in checked or checked in cond_1:
    if '0' in checked:
        print('0 in checked')
    elif '1' in checked:
        print('1 in checked')
    else:
        print('checked in cond_1')
    pass

Я запустил его и увидел следующее:

checked 249
checked 289
checked 70
0 in checked

С этого момента стало ясно, что мы должны были выйти изwhile (True) заявление. Я был озадачен, пока не сделал шаг назад.

for _ in range(len(alfabeto)+3):
    while True:

Я пропустил это из-за петли! Вы запускаете цикл while и разрываете его, когда не удается найти то, что удовлетворяло бы условиюЗатем вы запускаете его снова. В конце концов, в одном из этих циклов он набрал достаточное количество значений в cond_1, чтобы он навсегда оставался в цикле while.

...