Тщательная настройка производительности кода может занять столько же времени, сколько его написание.
Модуль timeit в Python — это инструмент для тестирования времени выполнения фрагментов кода. Он может быть использован из командной строки или непосредственно в коде для большего контроля. Модуль timeit удобен для санитарной проверки планируемых изменений в производительности.
Давайте измерим, сколько времени нужно, чтобы просуммировать целые числа от 0 до 999. Для начала из командной строки активируйте модуль timeit:
python -m timeit "total = sum(range(1000))"
timeit выполнит код суммирования много раз и в итоге выведет некоторую статистику о времени выполнения:
20000 loops, best of 5: 18.9 usec per loop
Из этого результата можно сделать вывод, что суммирование от 0 до 999 обычно занимает менее 20 микросекунд.
К счастью, не нужно строить диаграмму каждой функции и метода, которые вы пишете. Целый ряд инструментов, таких как SonarQube (www.sonarqube.org) и Radon (https://radon.readthedocs.io), может сделать это за вас. Эти инструменты можно даже интегрировать в редакторы кода, в результате чего вы получите возможность разбивать сложный код по мере разработки.
Барбара Лисков, профессор Массачусетского технологического института (MIT), разработала принцип, описывающий концепцию подстановки (замещения) в наследовании. Этот принцип гласит, что в программе любой экземпляр класса должен быть пригодным для замещения экземпляром одного из его подклассов без ущерба для правильности программы.23Правильность в этом контексте означает, что программа остается безошибочной и достигает тех же базовых результатов, хотя точный результат может быть другим или достигнут другим способом. Подстановка возникает из-за того, что подклассы строго придерживаются интерфейса своих суперклассов.
Этот код должен дать вам тот же результат, что и раньше. Может показаться, что мы переложили проблему, но это обеспечило определенную степень свободы. Теперь вы можете создавать любую причудливую шину или раму, которую пожелаете, и использовать ее вместо базовых версий. До тех пор пока класс FancyTire имеет те же методы и атрибуты, что и любая другая шина, велосипеду будет все равно.
Разделение ответственности означает очерчивание контура вокруг кода, занятого конкретной операцией
. Юнит-тесты предназначены для проверки поведения малых фрагментов ПО, поэтому без интеграционных тестов трудно сказать, работают ли эти малые фрагменты вместе, чтобы произвести что-то полезное как единое целое
