Пишем экологичный код на Python — охлаждаем планету. 8 советов

Выбросы заводов, сельское хозяйство и выхлопные газы конечно греют нашу планету, но вы когда-нибудь писали неоптимальный код? Тратили вычислительные ресурсы зря? Наш Python отдел подготовил несколько простых советов, которые помогут писать более чистый экологичный код и меньше греть планету.

Используйте профилировщики

Не забывайте время от времени запускать профилировщики, даже если вас «в принципе все устраивает». Они помогут найти места, требующие оптимизации.

Стандартом считается cProfile. Достаточно запустить

python -m cProfile my_code.py

Используйте **, когда это действительно оправдано

Оператор возведения в степень ** имеет довольно общую логику — это нужно для работы с отрицательными и дробными степенями. Но если нужно возвести число в целочисленную степень, обычный цикл справится гораздо быстрее.

Сравните время работы:

def power(): a = 5 a ** 2 >>> timeit(power) 0.36584561699999085

и более быстрый вариант:

def simple_power(): a = 5 a * a >>> timeit(simple_power) 0.11884730299993862

Не используйте + для создания длинных строк

В Python строка неизменяема, поэтому строки слева и справа от исходной будут скопированы в новую для каждой подобной пары конкатенации. Если у вас уже есть итерируемый объект, который нужно соединить, используйте join, он справится куда быстрее

Так что вместо:

result = first_name + ' ' + second_name + ' ' + last_name # timeit: 0.3436922719999984

используйте:

result = ' '.join([first_name, second_name, last_name]) # timeit: 0.27864367300003323

Используйте генераторы вместо циклов там, где это возможно

Помимо экономии памяти на длинных последовательностях, генераторы добавляют данные в список быстрее, чем это сделал бы append. Но не забывайте о читаемости кода, она не должна пострадать.

Вместо:

for word in wordlist: newlist.append(word.upper()) # timeit: 6.705280595999966

лучше написать:

newlist = [word.upper() for word in wordlist] # timeit: 3.2077471889999742

Убедитесь, что сравниваете одинаковые типы

Операции сравнения на разных типах данных работают необычайно долго. Не верите? Сравните сами:

timeit(‘10 < 10.0’) # 0.053260428999919895 timeit(‘10.0 < 10.0’) # 0.036753250999936427 timeit(‘10 < 10’) # 0.03092131900007189

Используйте встроенные функции

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

for i in range(1000): sum += i # timeit: 55.97384238399991

сделайте так:

reduce(add, range(1000)) # timeit: 48.04000816200005

Предпочитайте локальное глобальному

Прописная истина Python — работа с глобальными переменными медленнее работы с локальными.

Это работает не только с переменными, но и вообще со всеми объектами, даже модулями. Конечно, импортировать локально плохой тон, но иногда же можно? ;)

Учите алгоритмы

Оптимальные решения типовых задач уже давно придумали, так что знание алгоритмов может помочь вам не делать лишних операций.

Например, для проверки числа на простоту не обязательно делать так:

for i in range(n)

достаточно цикла:

for i in range(sqrt(n))

А как вы боретесь с экологией и оптимизируете свой код? Делитесь в комментариях. Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.

0
1 комментарий
Wittgenstein

Прикольно. Как замеряете скорость выполнения функций: пишите отдельную функцию?

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда