Для ускорения кода на Python программисты могут использовать много приемов. Мы собрали несколько самых простых и при этом самых эффективных из них.
Python – один из самых популярных языков программирования в мире. Этим он обязан своему простому синтаксису и богатой экосистеме. В последнее время он используется в соревновательном программировании, где большое значение имеет скорость выполнения программ.
Большинство из наших читателей, вероятно, уже начали писать на Python. Сперва всё кажется простым и очевидным. Но при решении задач со сложными алгоритмами начинается головная боль с Time Limit Exceeded
. Однако, в этом нет вины Python – это вина программиста. Да, Python медленный, но если программист напишет эффективную программу, она точно выполнится без подобных загвоздок.
Представляем вам несколько приемов и подходов для ускорения кода и повышения его эффективности.
Применение правильных структур данных значительно ускоряет выполнение кода.
В Python встроены такие структуры данных, как список (list
), кортеж (tuple
), множество (set
) и словарь (dictionary
). Несмотря на это, большинство людей хорошо помнят только про списки. Это неправильный подход.
Для ускорения кода используйте те структуры данных, которые максимально соответствуют вашей задаче. Особенно это касается выбора между списком и кортежем, ведь итерирование по последнему занимает куда меньше времени.
В случаях, когда цикл for
обрабатывает диапазон непостоянного размера, его выполнение в Python происходит медленнее, чем выполнение цикла while
. Поэтому в таких случаях лучше прибегайте к while
.
Не обращайтесь ни к какой другой технике, если можно использовать списковые включения. Например, этот код заносит в список все числа между 1 и 1000, кратные 3:
L = [] for i in range (1, 1000): if i%3 == 0: L.append (i)
Со списковыми включениями код трансформируется в одну строку:
L = [i for i in range (1, 1000) if i%3 == 0]
Этот приём работает быстрее, чем просто метод append()
.
Не стоит инициализировать несколько переменных так:
a = 2 b = 3 c = 5 d = 7
Лучше придерживайтесь следующего синтаксиса:
a, b, c, d = 2, 3, 5, 7[python_ad_block]
Да, в Python есть ключевое слово global
для объявления таких переменных. Но операции с ними требуют больше времени, чем с локальными. Потому не создавайте глобальные переменные без крайней необходимости.
Не пишите функцию вручную, если она уже реализована в какой-нибудь библиотеке. Библиотечные функции крайне эффективны, и, скорее всего, вам не удастся достичь лучшего результата самостоятельно.
В Python конкатенацию строк можно производить при помощи знака +
.
concatenatedString = "Программирование " + "это " + "весело."
Но также для этого есть метод join()
.
concatenatedString = " ".join (["Программирование", "это", "весело."])
Всё дело в том, что оператор +
каждый раз создаёт новую строку, а затем копирует в неё исходные. join()
устроен иначе и обеспечивает выигрыш во времени.
Если у вас в списке хранится много данных, которые требуется использовать все за раз, применяйте generator
. Это сэкономит ваше время.
Взгляните на следующий код:
L = [] for element in set(L): ...
Данный код может показаться эффективным, так как в нём для удаления дубликатов используется set
. Но на самом деле он будет выполняться долго. Не забывайте, что приведение списка ко множеству – это время. Так что этот вариант будет лучше:
for element in L: ...
Старайтесь не пользоваться ими. Взгляните на пример:
import math val = math.sqrt(60)
Вместо этого можно применить следующий синтаксис:
from math import sqrt val = sqrt(60)
Всё потому, что когда вы вызываете функцию с помощью точки, она сперва обращается к методу __getattribute()__
или __getattr()__
. Эти методы, в свою очередь, используют операции со словарями, отнимающие время. Поэтому старайтесь писать: from module import function
.
Пишите while 1
вместо while True
. Это выиграет вам немного времени.
Не бойтесь применять новые практики для повышения эффективности кода.
Допустим, у вас есть код:
if a_condition: if another_condition: do_something else: raise exception
Вместо этого стоит попробовать:
if (not a_condition) or (not another_condition): raise exception do_something
Медлительность Python послужила вдохновением для различных проектов, сокращающих его время работы. На большинстве соревнований по программированию вы встретитесь с pypy
(там, где можно писать на Python).
Эти средства помогут уменьшить время выполнения Python-программ.
C/C++ быстрее Python. Поэтому многие пакеты и модули, которые можно использовать в программах на Python, пишутся на C/C++. Среди таких модулей – Numpy, Scipy и Pandas, столь необходимые при обработке больших массивов данных.
Python регулярно обновляется и совершенствуется и с каждым релизом становится всё быстрее и оптимизированнее. Поэтому для ускорения кода всегда пишите его на новейшей версии языка.
Мы рассмотрели приёмы для ускорения кода на Python. Конечно, этот список не исчерпывающий: есть и другие способы, которые могут вам пригодиться. Обязательно ищите их и пишите код эффективно!
Перевод статьи Speed Up Python Code.
Python предлагает набор библиотек, удовлетворяющих различные потребности в визуализации, будь то академические исследования, бизнес-аналитика или…
В Python для представления данных в двоичной форме можно использовать байты. Из этой статьи вы…
В этой статье рассказывается о том, что такое Werkzeug и как Flask использует его для…
При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные…
В этом руководстве мы рассмотрим, как добавить социальную аутентификацию с помощью GitHub и Google в…
В этой статье мы рассмотрим, что такое подсказки типов и чем они могут быть полезны.…