Главная

Как чистый код влияет на вычислительную мощность.

О противоречиях написания чистого кода.

685 

8+

Почему люди пишут код, подобный такому:

Ответ: чтобы сэкономить вычислительное время.

Этот код можно также расширить в три строки :

Люди, которые волнуются по поводу вычислительных затрат, покачают головой и выберут первое. Многие утверждают, что определение новых переменных занимает вычислительное пространство настолько сильно, что с увеличением итераций это имеет существенное значение. В этой статье я расскажу, какова истинная стоимость чистого кода с переназначением переменных.

Преимущества множественного назначения переменных.

Разработчики часто помещают несколько операций в одну строку, особенно в таком языке, как Python, где есть как минимум десять способов написания чего-либо. Однако это сильно усложняет чтение кода. В случае с множественным назначением переменных функции читаются лучше. Кроме того, это облегчает чтение слоев, содержащихся в скобках, когда применяется более трех функций:

Более того, трудно отследить состояние переменной, если множество операций с ней совершатся в одной строке. Это как учиться математике — сначала надо начинать с арифметики, а затем переходить к дифференциальному исчислению, вместо того, чтобы учить оба одновременно. Определение нескольких переменных означает, что читатель может отслеживать, что происходит с переменной и в каком состоянии она находится. Во многих случаях добавление переменных экономит вычислительную мощность. К примеру:

Если вы присвоите (b + 5) одной переменной, то это значение вычисляется только один раз, а не несколько.

Тестирование на списках и встроенных функциях Python.

Вот тест на время вычислений. Он использует несколько встроенных функций Python, таких, как str(), индексацию списка и арифметические операции:

Какой из вариантов лучше?

Список alist генерируется как:

Время, затраченное на создание списка, не засекалось.Но время исполнения было взято со строк кода, которые выполняли тестовые операции. Операции были выполнены 5.000.000 раз с разным сгенерированным списком. Среднее значение бралось каждые 100.000 раз и нанесено на график, где “Cleaned” обозначает четырехстрочную версию кода, а “Shortened” однострочную:

Да, “Shortened” версия почти везде отработала быстрее, но отрыв незначительный. При небольших масштабах эта быстрота вообще никоим образом не проявляется. Среднее время “Shortened” версии составило 0,000005521, а “Cleaned” 0,000005733. Разница = 0,000005521. Это означает, что для того, чтобы ощутить разницу во времени работы хотя бы в одну минуту, процесс должен быть повторен по крайней мере 10.867.596 раз. Чтобы ощутить часовую разницу, процесс должен быть повторен, по крайней мере, 652.055.786 раз.

Тестирование на Pandas DataFrames

Дополнительным тестом будет выполнение операций не только над списками Python, но и над кадрами Python Pandas DataFrames. Это основной тип для данных машинного обучения и data science в Python, напоминающий электронную таблицу Excel.
Тестовая операция:

Где df — DataFrame
Немного информации:
data.loc[x: y] выбирает строки данных, индексы которых находятся между x и y включительно.
data[data [‘column’]>5] выбирает строки данных, столбец которых, в данном случае именуемый column, больше пяти (или некоторых других условий) и возвращает nan для строк, которые не соответствуют критериям.
data.dropna() удаляет любую строку, имеющую значение nan.
column.std() принимает стандартное отклонение столбца/серии чисел.
column.mean() принимает среднее значение столбца/серии чисел.

Эту операцию можно также разбить на 6 строк с тремя переменными:

Тестовые операции были выполнены на случайно сгенерированном DataFrame с двумя столбцами a и b и 200 строками. Все значения были случайным образом выбраны от 1 до 10 включительно.Тестовые операции, как в “Cleaned”, так и в “Shortened” версиях, выполнялись 50000 раз, в среднем каждые 1000 раз. Каждое повторение выполнялось на новом случайно сгенерированном DataFrame.

Воу! “Cleaned” код работает в среднем лучше, чем “Shortened”.
Средняя разница составляет 0,0111 на одну итерацию, а среднее число “Cleaned” циклов составило 0,0106. Разница в 0,0005 означает, что в случае написания чистого кода при работе с операциями DataFrame120.000 итераций могут сэкономить одну минуту вычислительного времени. 7.200.000 итераций сэкономят один час вычислительного времени.

Заключение

Все просто — пишите чистый код! Не бойтесь увеличения вычислительного времени из-за множественного назначения переменных. Не бойтесь использовать переопределение переменных. Чистый код не только повышает читабельность, но и может в некоторых случаях (как продемонстрировал эксперимент Pandas DataFrame) повысить производительность.
Если вы хотите повторить мои эксперименты, исходный код и результаты доступны на Kaggle здесь:
Experiment with Python Lists
Experiment with Pandas DataFramesСпасибо за чтение!

Спасибо за внимание!

Онлайн-обучение программированию на Python от Skillbox

8+