Comments 6
Дежавю. Вроде как пару дней назад видел эту статью.
Почему Карл, почему?...
В последнее сравнение я бы в функцию test_if() в каждую ветку добавил бы пару сравнений
isinstance(element, dict) and len(element) == 2 and ...
А иначе, если element, это не словарь, то в этой функции вылетит ошибка AttributeError, а вторая отработает без ошибок. Ну и вторая функция проверяет, что в словаре 2 элемента, а данная - нет. А тогда разница будет - тройка. Уже лучше, и, да, за читабельность кода надо платить.
Наверное стоило сделать ещё тест, который продемонстрировал бы сложность О. Может при сотне кейсов время выполнения и сравняется.
Предположу, что при ровных руках разработчиков сложность match/case можно довести до O(1), ну или хотя бы O(log n), в зависимости от мапы под капотом. А вот if/else всегда будет O(n).
Рано делать выводы, проверим работу с еще более сложными структурами
Попробуйте наоборот энум на 50 вариантов. Скорее всего, чем проще проверка, тем эффективнее match/case.
Ну проверки у вас не верные, поэтому и время не верное, если написать более правильно то и результат другой
def test_match(data):
for word in data:
match word:
case 'дом' | 'думать' | 'что-то' | 'просто':
pass
case int():
print(word)
case str() if len(word) > 3:
pass
case str() if word.startswith("д"):
pass
case _:
pass
>>> РЕЗУЛЬТАТ MATCH/CASE: 0.21404509879399847
да это по прежнему дольше чем классический if else, но разница в скорости совсем другая
Match/case vs If/else. Сравниванием скорость работы операторов в Python 3.10