Сначала задайте осмысленное равенство и согласованный хеш. Для списка используйте 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). В обоих случаях преобразование каждого слова необходимо.