Задать вопрос
@ffff567

Как можно ускорить выполнение этого кода?

поиск анагрммм на питоне
как можно оптимизировать код для поиска анаграмм.
Учтите что код идеальный что то удалять из него или перставлять местами не нужно. только ухудшит время выполнение. Можно придумать только другую логику

задание="АРОКСИЛИРОВАНИЕ".lower()+"\n"
длина=7

with open('D:\\Program Files\\Text\\слова\\1.txt', 'r') as f:
    zad=len(задание)
    x=[i for i in f.readlines() if zad>=len(i)>=длина+1]
    список=[i for i in x if all(z in задание for z in i) and all(i.count(z)<=задание.count(z) for z in i)]
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
ZERGeich
@ZERGeich
Совет на будущее: насчёт идеальности кода - это ваше оценочное суждение и не надо его вставлять в вопрос, если вы хотите получить хоть какой-то дельный ответ.

from collections import Counter
задание = "АРОКСИЛИРОВАНИЕ".lower()
длина = 7

counter_задание = Counter(задание)

with open('D:\\Program Files\\Text\\слова\\1.txt', 'r') as f:
    filtered_words = (word.strip() for word in f if длина <= len(word.strip()) <= len(задание))
    результат = [word for word in filtered_words if Counter(word) <= counter_задание]
Ответ написан
Vindicar
@Vindicar
RTFM!
Я верно понимаю, что нужно найти слова не короче заданной длины, которые можно составить из букв данного слова?
Во-первых, может иметь смысл сразу отбросить слова, содержащие буквы не из данного слова, чтобы в дальнейшем анализировать только сравнительно допустимые слова. Также может иметь смысл использовать для подсчёта количества букв collections.Counter.
Например, так
from collections import Counter

main_word = 'АКСИЛИРОВАНИЕ' + '\n'  # основное слово + перенос строки, чтобы не вызывать str.rstrip()
main_set = frozenset(main_word)  # множество букв слова без учёта повторов
main_len = len(main_word)
min_length = 8
with open('D:\\Program Files\\Text\\слова\\1.txt', 'r') as f:
    candidates = [  # слова-кандидаты, состоящие из тех же букв и подходящие по длине
        (word, Counter(word))  # само слово и его состав по буквам
        for word in f  # для всех слов в файле
        # проверяем длину слова и соответствие набора букв без учёта их количества
        if min_length<=len(word)<=main_len and main_set.issuperset(word)  
    ]
main_counter = Counter(main_word)  # подсчёт числа букв в основном слове
results = [  # итоговый результат
    word  # те слова
    for word, counter in candidates  # из числа слов-кандидатов
    if all(counter[key] <= main_counter[key] for key in counter)  # у которых нет превышения ни по одной букве
]


Во-вторых, важна структура файла. Например, если строки в файле расположены по возрастанию длины, мы можем попробовать быстренько пропустить короткие слова в начале файла, обработать то, что идёт после, и остановиться, когда дойдём до слов длиннее заданного.
В-третьих, если вместо текстового файла использовать, скажем, pickle-файл, и хранить в нём предрассчитанные количества букв для каждого слова, то это потенциально может ускорить процесс.
Но чтобы проверить скорость работы кода, нужна ссылка на пример файла со словами. И уточни, как обрабатывается буква Ё.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы