Как ускорить вычисление цикла

#python #python-3.x #for-loop #while-loop #nested

Вопрос:

Я хочу, чтобы этот код вычислялся быстрее . В моем коде слишком много циклов, я хочу сделать их меньше. Как минимизировать цикл for и цикл while. Мой код собирается разделить английские слова, появляющиеся в строках (строках) текста, 3 символа и подсчитать частоту трех наборов символов. Функция имеет значение dict, где ключ представляет собой набор из трех символов в тексте, а значение-частота этого символа в ключе. Должно быть слово, счетчик частот не учитывает регистр («муравей» и «Муравей» — это кадия), если длина меньше 3. Символы должны быть определены как ключи, такие как «a», «in».

 def main():
    text = "Thank you for help me"
    print(three_letters_count(text))


def three_letters_count(text):
    d = dict()
    res = []
    li = list(text.lower().split())
    for i in li:
        if len(i) < 3:
            res.append(i)  
        while len(i) >= 3: 
            res.append(i[:3])  
            i = i[1:]
    
    for i in res:
        d[i] = res.count(i)
        
    return d
    
    



if __name__ == '__main__':
    main()
 

Комментарии:

1. Какова конечная цель вашей функции. Чего вы от этого ожидаете?

2. Я хочу, чтобы он работал быстрее.

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

4. Это ваш ожидаемый результат: {«тха»: 1, «хан»: 1, «анк»: 1, «ты»: 1, «для»: 1, «хель»: 1, «элп»: 1, «я»: 1}`. (просто запустите свой код). Ваша цель? как здесь не совсем ясно …

5. Я бы также ожидал «жесть» в вашем примере. Первый цикл for избавляет вас от необходимости самостоятельно анализировать строку за счет однократного перебора строки. Цикл while можно изменить, вырезав из некоторой начальной позиции вместо начала строки. Это избавило бы вас от необходимости многократно делать копии i . И если бы вы использовали хэш для своего res , вы могли бы считать на лету, вместо того, чтобы считать потом.

Ответ №1:

Как и было обещано, просто альтернатива принятому ответу:

 def main():
    text = "Thank you for help me thank you really so much"
    print(three_letters_count(text))


def three_letters_count(text):
    d = dict()
    res = {}
    li = list(text.lower().split())
    for i in li:
        if len(i) < 3:
            if (i in res):
                res[i] = res[i]   1
            else:
                res[i] = 1  
        startpos = 0
        for startpos in range(0, len(i)):
            chunk = i[startpos:startpos   3]
            if (chunk in res):
                res[chunk] = res[chunk]   1
            else:
                res[chunk] = 1

    return res

if __name__ == '__main__':
    main()
 

Это дает (с измененным вводом):

 {'tha': 2, 'han': 2, 'ank': 2, 'you': 2, 'for': 1, 'hel': 1, 'elp': 1, 'me': 1, 'rea': 1, 'eal': 1, 'all': 1, 'lly': 1, 'so': 1, 'muc': 1, 'uch': 1}
 

Ответ №2:

Вы могли бы изменить свой while внешний вид и переключить это на for цикл.

См. скорректированную функцию ниже.

 def three_letters_count(text):
    d = dict()
    res = []
    li = list(text.lower().split())
    for i in li:
        if len(i) < 3:
            res.append(i)  
        for index in range(0, len(i)):
            three_letter = i[index:index 3]
            if(len(three_letter) >= 3):
                res.append(three_letter)
    
    for i in res:
        d[i] = res.count(i)
        
    return d