LINUX.ORG.RU

Как оптимизировать пару функций на python

 ,


0

1

Функция 1 - получает кусок html в виде строки, дальше она удаляет все html тэги.

Заменяет все символы, кроме букв на пробелы и делает весь текст нижним регистром.

Вырезает все слова меньше 3х символов и лишние пробелы.

def normal_str(s):
    #remove all html tags
    s = re.sub('<.*?>', ' ', s)
    #replace all non alphebetical characters with spaces
    s = re.sub('[^a-z]', ' ', s.lower())
    #remove all words with less than 3 letters and extra spaces
    result = ' '.join(i for i in s.split() if len(i)>2)
    return result

Функция 2 на входе получает строку, а на выходе выдает list состоящий из хэшей троиц слов

хэш1 = хэш(слово1 + слово2 + слово3)

хэш2 = хэш(слово2 + слово3 + слово4)

...

хэшN = хэш(словоN + словоN+1 + словоN+2)

Хэши подогнан под формат bigint MySQL, который будет потом записан в БД.

list хэшей сортируется по величине и из него удаляются дубли.

def words_hash(string):
    words = string.split()
    i = len(words)
    n = 0
    hs = []
    while n <= i-3:
        st = words[n] + words[n+1] + words[n+2]
        hs.append(int(hashlib.sha256(st.encode('utf-8')).hexdigest(), 16) % 10**16)
        n = n + 1
    hs.sort()
    return list(dict.fromkeys(hs))

В принципе обе функции работают нормально, просто если можно их оптимизировать, я бы это сделал.

В принципе, особо тут и нечего оптимизировать.

В первой функции можно заменить два вызова re.sub() на один re.split('<.*?>|[^a-z]', s.lower()). Во второй — использовать метод .digest() вместо .hexdigest() и затем int.from_bytes(...). Но это такое всё.

Из косяков: 1) перевод из списка в строку в одной функиции, а потом перевод обратно из строки в список во второй; 2) dict.fromkeys(hs) не будет тебе гарантировать сохранность предыдущей сортировки, лучше поменять тип hs на set и потом возвращать sorted(hs).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.