Повышение производительности кода: класс с переопределёнными методами и преобразование списка в верхний регистр

Сначала задайте осмысленное равенство и согласованный хеш. Для списка используйте comprehension, а для потокового потребления — генератор.

Короткий ответ

Что ответить на собеседовании

Сначала задайте осмысленное равенство и согласованный хеш. Для списка используйте comprehension, а для потокового потребления — генератор.

Подробный разбор

Ответ с пояснениями

Условие

Как можно сделать представленный ниже фрагмент кода более эффективным? В нём определён класс с переопределёнными методами __hash__ и __eq__, а также реализовано преобразование элементов списка в верхний регистр.

class HashableItem:
    def __hash__(self):
        return 42

    def __eq__(self, other):
        return True

result = []
for word in source:
    result.append(word.upper())

Подумайте, какие изменения позволят сократить количество операций, улучшить читаемость и уменьшить потребление памяти.

Ответ

Сначала задайте осмысленное равенство и согласованный хеш. Для списка используйте comprehension, а для потокового потребления — генератор.

Постоянный хеш создаёт коллизии, а __eq__, всегда возвращающий True, объявляет все экземпляры равными. Это проблема корректности, а не только скорости. Сравнивайте значимые неизменяемые поля и вычисляйте хеш по тем же полям; для постороннего типа возвращайте NotImplemented.

result = [word.upper() for word in source]
# Если список не требуется:
stream = (word.upper() for word in source)

Comprehension короче цикла, но всё равно хранит весь результат. Генератор экономит память только при последовательном потреблении без последующего list(stream). В обоих случаях преобразование каждого слова необходимо.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее