繁体   English   中英

为什么 python 进入循环并占用我 40% 的 CPU?

[英]Why python goes in loop and takes up to 40% of my CPU?

我正在测试一些代码,由于某种原因 python 无法到达代码的末尾,占用了我 40% 的 CPU。

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))

在您的代码中添加一些调试后

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:

我错过了那个 for 循环。 你正在运行那个 while 循环,当它找不到满足条件的东西时中断,然后。 你再次运行它,最终,在其中一个循环中,它在cond_1中积累了足够的值,它将永远停留在 while 循环中。

如果我们稍微重新安排一下代码,我们就能明白为什么这永远不会完成。 我首先将内部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 个值,正如 Tomerikoo 观察到的那样,这比列表中的 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)之类的东西上将完成

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM