Оптимизация производительности тренировочной программы - PullRequest
0 голосов
/ 17 января 2019

Я пишу простую тренировочную программу на python. В нескольких словах из заданной строки необходимо разделить входной текст с помощью этих разделителей: , ; : . ! ( ) " ' \ / [ ] space в список слов. Тогда мне нужно печатать только слова в нижнем регистре, слова в верхнем регистре и слова в смешанном регистре.

Вот мое решение:

import re
import time

text = input()
start_time = time.time()

list_of_words = list(re.findall(r"[\w']+", text))

lower_cases_list = [word for word in list_of_words if word.islower()]
upper_cases_list = [word for word in list_of_words if word.isupper()]
mixed_cases_list = [word for word in list_of_words if not word.islower() and 
not word.isupper()]

print('Lower-case:', ', '.join(lower_cases_list))
print('Mixed-case:', ', '.join(upper_cases_list))
print('Upper-case:', ', '.join(mixed_cases_list))
print("--- %s seconds ---" % (time.time() - start_time))

Пока все хорошо, все работает правильно, но на платформе, на которой я тестирую задачу, допустимое время выполнения составляет 0,100 с, в лучшем случае моя программа выполняется со временем 0,134 с. Может ли кто-нибудь помочь мне оптимизировать код для лучшей производительности?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Кажется, что встроенная библиотека re медленнее, чем обычные методы, такие как .replace () и .split ()

Сэтот код:

def h(txt):
    txt = txt.replace(',', r' ')
    txt = txt.replace(';', r' ')
    txt = txt.replace(':', r' ')
    txt = txt.replace('.', r' ')
    txt = txt.replace('!', r' ')
    txt = txt.replace('(', r' ')
    txt = txt.replace(')', r' ')
    txt = txt.replace('"', r' ')
    txt = txt.replace('\'', r' ')
    txt = txt.replace('\\', r' ')
    txt = txt.replace('/', r' ')
    txt = txt.replace('[', r' ')
    txt = txt.replace(']', r' ')

    return txt


def do_all(list_of_words):
    lower_cases_list = []
    upper_cases_list = []
    mixed_cases_list = []

    for word in list_of_words:
        if word.islower():
            lower_cases_list.append(word)
        elif word.isupper():
            upper_cases_list.append(word)
        else:
            mixed_cases_list.append(word)

    print('Lower-case:', ', '.join(lower_cases_list))
    print('Mixed-case:', ', '.join(mixed_cases_list))
    print('Upper-case:', ', '.join(upper_cases_list))

text = h(input()).split()

do_all(text)

Время выполнения <0,50 мс.Итак, проблема решена.<strong> .split () и .replace быстрее, чем re

0 голосов
/ 17 января 2019

Вы повторяете свои слова три раза. Сделайте это один раз с одним циклом for:

for word in list_of_words:

    if word.islower():
        lower_cases_list.append(word)
    elif word.isupper():
        upper_cases_list.append(word)
    else:
        mixed.append(word)

Кроме того, поскольку теперь вы перебираете свой list_of_words только один раз, вам на самом деле не нужно составлять список, и вы можете просто использовать генератор, сэкономив немного больше времени:

list_of_words = re.findall(r"[\w']+", text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...