簡體   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