Язык Python очень хорош и приятен для программирования, однако некоторые задачи в нём будут выполняться дольше, чем хотелось бы. Критический для написания многих программ вопрос - "насколько дольше?". В данном gist'е я попытаюсь сравнить время выполнения трёх программ, решающих одну и ту же задачу (№2791 "В начало строя!" с informatics.mccme.ru).
Первая программа будет реализовывать дерево "явно", используя класс ImplicitNode для хранения узла дерева. Для доступа к потомкам будут использоваться ссылки.
Вторая программа будет хранить дерево в виде списка списков - в списке nodes будут храниться списки по 5 элементов каждый, в котором уже будут храниться все данные узла. Вместо ссылок будут использованы индексы в списке nodes.
Третья программа - "наивное" решение задачи. Деревья не используются, используются слайсы в списках. Это решение приведено как "контрольное".
К сожалению, полноценного локального тестирования я не проводил (хотя это было бы, наверное, достаточно занятно и произвело бы на свет несколько красивых графиков). Вместо этого я ограничился отсыланием задачи на informatics и подсчётом верно проиденных тестов. Допускаются тесты, на которых превышается время тестирования, не допускаются тесты с неправильным ответом
Программа | Количество тестов
2791_class.py | 9
2791_list.py | 11
2791_naive.py | 13
Очевидно, результаты можно было бы улучшить: так, вариант решения 2791_list.py, использующий map(int, input().split())
, работает
медленнее, чем предложенный. Вполне возможно, что допустимы и другие "оптимизации". Однако необходимость прибегать к неочевидным ходам,
необходимость делать код менее очевидным и более запутанным, кажется, подрывает самую главную идею написания кода на данном языке (краткость
и очевидность).
Тем не менее, буду признателен за любые комментарии, подкреплённые более производительным (проходящим большее количество тестов) кодом.