Python
Материал из Википедии — свободной энциклопедии
Семантика: | императивный, функциональный |
---|---|
Тип исполнения: | интерпретатор |
Появился в: | 1990 г. |
Автор(ы): | Гвидо ван Россум |
Типизация данных: | строгая, динамическая |
Основные реализации: | CPython, Jython, IronPython, PyPy, Stackless |
Диалекты: | отсутствуют |
Создан под влиянием: | ABC, Perl, Lisp, Smalltalk, Tcl |
Оказал влияние на: | Ruby, Boo |
Python (пито́н, па́йтон) — интерпретируемый объектно-ориентированный язык программирования высокого уровня с динамической типизацией, автоматическим управлением памятью и удобными высокоуровневыми структурами данных, такими как словари (хэш-таблицы), списки, кортежи. Поддерживает классы, модули (которые могут быть объединены в пакеты), обработку исключений, а также многопоточные вычисления. Питон обладает простым и выразительным синтаксисом. Язык поддерживает несколько парадигм программирования: структурное, объектно-ориентированное, функциональное и аспектно-ориентированное.
Интерпретатор Питона существует для большинства распространённых платформ. Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в коммерческих приложениях. Текущая версия 2.5 вышла 19 сентября 2006 года.
Содержание |
[править] Философия
Вольный перевод Дзэна Питона (автор Тим Пейтерс):
- Красивое лучше уродливого.
- Явное лучше неявного.
- Простое лучше сложного.
- Сложное лучше усложнённого.
- Последовательное лучше вложенного.
- Разрежённое лучше, чем плотное.
- Удобочитаемость существенна.
- Частные случаи не настолько существенны, чтобы нарушать правила.
- Однако практичность важнее регулярности.
- Ошибки никогда не должны умалчиваться.
- Если явно не указано умалчивать.
- В случае неоднозначности сопротивляйтесь искушению угадать.
- Должен существовать один — и, желательно, только один — очевидный способ.
- Хотя он может быть с первого взгляда неочевиден, если ты не голландец (намёк на Гвидо ван Россума)
- Сейчас лучше, чем никогда.
- Но никогда часто бывает лучше, чем прямо сейчас.
- Если реализацию идеи тяжело объяснить, она плоха.
- Если реализацию идеи легко объяснить, она может быть хороша.
- Пространства имён — великолепная идея, их должно быть много!
Английский (оригинальный) вариант «Дзэна Питона» выдаётся интерпретатором Питона по команде import this (работает один раз).
[править] История
Питон создал в начале 1990-х сотрудник голландского института CWI Гвидо ван Россум (Guido van Rossum). Для распределенной ОС Amoeba требовался расширяемый сценарный язык, и Гвидо начал писать Питон на досуге, заимствовав некоторые наработки для языка АВС (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). Затем язык начал свободно распространяться через Интернет и понравился другим программистам. С самого начала Питон проектировался как объектно-ориентированный язык. Питон также позаимствовал многие черты таких языков, как Си, Си++, Modula-3 и Icon, и отдельные черты функционального программирования из Лиспа.
Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного сериала 70-х годов «Воздушный цирк Монти Пайтона». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с фильмом — пиктограммы файлов в KDE или в Windows и даже эмблема на сайте python.org изображают змеиные головы.
Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из фактором успеха Питона. Развитие языка происходит согласно четко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Питона см. [1].
Начата работа над Python 3000 — версией языка, в которой будут устранены многие недостатки в дизайне с максимально возможным сохранением совместимости со старыми версиями Питона.
[править] Портируемость
Питон портируем и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Windows, все варианты UNIX (включая Linux), Plan 9 , Mac OS и Mac OS X, Palm OS, OS/2, Amiga, AS/400 и даже OS/390 и Symbian.
При этом, в отличие от многих портируемых систем, на каждой платформе Питон поддерживает все характерные для данной платформы технологии (например, Microsoft COM/DCOM). Более того, существует специальная версия Питона для виртуальной машины Java — Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Питона и даже быть написанными на Питоне. Не так давно началась разработка системы, предназначенной для более полной интеграции с платформой .NET — Iron Python.
[править] Типы и структуры данных
Python поддерживает динамическую типизацию, то есть, тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Питоне имеются встроенные типы: булевский, строки, Unicode-строки, целые числа произвольной точности, числа с плавающей запятой, комплексные числа и некоторые другие. Из коллекций Питон поддерживает кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии 2.4, множества. Все значения в Питоне являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Любой тип входит в иерархию классов, и при необходимости возможно наследование даже от большинства встроенных типов.
Все объекты делятся на изменяемые и неизменяемые. Например, строки являются неизменяемыми, поэтому для них не предусмотрено операций, изменяющих строку. Списки являются изменяемыми, например, метод .sort()
сортирует список «на месте». Кортеж в Питоне является, по сути, неизменяемым списком.
[править] Синтаксис и семантика
Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Питоне программ легко читаем. См. также Python syntax and semantics(англ.).
[править] Операторы
Набор операторов достаточно традиционен. Вот некоторые из них:
- условный оператор
if
(если). Альтернативный блок послеelse
(иначе). Если условий и альтернатив несколько, можно использоватьelif
(сокр. от else if). - оператор цикла
while
(пока). - оператор цикла
for
(для). Внутри цикла возможно применениеbreak
иcontinue
для прерывания цикла и перехода сразу к следующей итерации соответственно. - оператор определения класса
class
. - оператор определения функции, метода или генератора
def
. Внутри возможно применениеreturn
(возврат), а в случае генератора —yield
(давать). - оператор обработки исключений
try
-except
-else
илиtry
-finally
(Начиная с версии 2.5 можно использоватьfinally
,except
иelse
в одном блоке). - оператор
pass
ничего не делает. Используется для пустых блоков кода.
Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Питоне отсутствуют операторные скобки begin/end как в языке Паскаль или фигурные скобки, как в Си. Этот «трюк» позволяет заметно сократить количество строк и символов в программе:
Программа на C | Эквивалентная программа на Python |
---|---|
int factorial(int x) { if (x == 0) { return 1; } else { return x * factorial(x-1); } } |
def factorial(x): if x == 0: return 1 else: return x * factorial(x-1) |
Таким образом, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторые критики языка считают такое поведение контринтуитивным.
[править] Выражения
Выражение является полноправным оператором в Питон. Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок.
Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии со sprintf() из Си), которая использует тот же символ, что и взятие остатка от деления:
>>> print "Здравствуй, %s!" % "Мир" Здравствуй, Мир!
Питон имеет удобные цепочечные сравнения. Такие условия в программах — не редкость:
1 <= a < 10 and 1 <= b < 20
Кроме того, логические операции (or
и and
) являются «ленивыми»: если для вычисления истинностного значения достаточно первого операнда, этот операнд и является результатом (в противном случае вычисляется второй операнд). Этот факт широко использовался до версии 2.5 вместо условной конструкции:
(a < b) and "меньше" or "больше"
Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):
"строка" + 'строка' # """тоже строка""" # u"Юникод-строка" # True or False # булевские литералы 3.14 # число с плавающей запятой 012 + 0xA # числа в восьмиричной и шестнадцатеричной системах счисления 1 + 2j # целое число и мнимое число [1, 2, "a"] # список (1, 2, "a") # кортеж {'a': 1, 'b': 'B'} # словарь lambda x: x**2 # неименованная функция
Для списков (и других последовательностей) Питон предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M]
означает, что в срез попадают все элементы от N включительно до M исключительно. В качестве иллюстрации можно посмотреть этот пример.
[править] Имена
Имя (идентификатор) может начинаться с латинской буквы любого регистра или подчеркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print keyword.kwlist
) и нежелательно переопределять встроенные имена. Имена, начинающиеся на подчеркивание, имеют специальное значение.
В каждой точке программы интерпретатор имеет доступ к трем пространствам имён: локальному, глобальному и встроенному. (Пространство имён — это отображение имён в объекты.)
Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружаещего блока кода). На практике с областями видимости и связыванием имен связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
[править] Строки документации
Питон предлагает механизм документирования кода pydoc. Каждый модуль, класс, функцию или метод желательно снабжать строкой документации (docstring). В этом случае в интерактивном режиме можно получить помощь по любому из них, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest для автоматического тестирования модуля.
[править] Директивы
Начиная с Python 2.3, необходимо в начале модуля явно указывать кодировку исходного кода (если это не ASCII), например:
# -*- coding: koi8-r -*-
Указав кодировку, можно не бояться писать кириллицу в Unicode-литералах.
[править] Возможности
[править] Интерактивный режим
Подобно LISP, Prolog или Perl в режиме отладки, интерпретатор Питона имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран. Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.
Так выглядит общение с Питоном в интерактивном режиме:
>>> 2 ** 100 # возведение 2 в степень 100 1267650600228229401496703205376L >>> from math import * # импорт математических функций >>> sin(pi * 0.5) # вычисление синуса от половины пи 1.0 >>> help(sorted) # помощь по функции sorted Help on built-in function sorted in module __builtin__: sorted(...) sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
В интерактивном режиме доступен отладчик pdb
и система помощи (вызывается по help()
). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.
Кроме встроенной, существует и улучшенная интерактивная оболочка IPython.
[править] Объектно-ориентированное программирование
Дизайн языка Питон построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. Поддерживается:
- Наследование, в том числе множественное
- Полиморфизм (все функции виртуальные)
- Инкапсуляция (два уровня - общедоступные и скрытые методы и поля)
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти
- Перегрузка операторов (всех, кроме
'.','='
и символьных логических) - Свойства (имитация поля с помощью функций)
- Управление доступа к полям (эмуляция полей и методов, частичный доступ,и т.п.)
- Методы для управления наиболее распространенными операциями (истинностное значение,
len()
, глубокое копирование, сериализация, итерация по объекту, ...) - Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
- Полная интроспекция
- Классовые и статические методы, классовые поля
- Классы вложенные в функции и классы
[править] Функциональное программирование
Python поддерживает парадигму функционального программирования, в частности:
- функция является объектом
- функции высших порядков
- рекурсия
- развитая обработка списков (списковые выражения, операции над последовательностями, итераторы)
- аналог замыканий
- частичное применение функции
- возможность реализации других средств на самом языке (например, карринг)
[править] Модули и пакеты
Программное обеспечение (приложение или библиотека) на Питоне оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут быть двух типов по своему происхождению: модули, написанные на "чистом" Питоне, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть "чистый" модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет - в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import
. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имен модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload()
.
[править] Интроспекция
Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках Питона, таких как: PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.
[править] Обработка исключений
Обработка исключений поддерживается в Python посредством операторов try, except, else, finally, raise
, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:
try: #здесь код, который может возбудить исключение raise ExceptionType("message") except (Тип_исключения1,Тип исключения2,...),Переменная: #Если тип возбужденного исключения совпадает с одним из типов #(Тип_исключения1,Тип исключения2,...) или является его наследником #то значение исключение записывается в Переменную и исполняется код #except блока. Переменной может не быть. except (Тип_исключения3,Тип исключения4,...),Переменная: #количество блоков except не ограниченно raise #перевозбудить текущее исключение except: #Будет исполненно при любом исключении else: #если не было исключения finally: #будет исполненно в любом случае, возможно после соответствующего #блока except или else
Совместное использование else, except
и finally
стало возможно только начиная в Python 2.5. Информация о текущем исключении всегда доступна через sys.except_info()
. Кроме значения исключения Python так-же сохраняет состояние стека вплоть до точки возбуждения исключения - так называемый traceback.
В отличии от компилируемых языков программирования в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяют ускорить исполнение программ) и очень широко используется. Исключения так-же хорошо вписываются в идеологию Python - "duck typing" (вместо явной проверки возможности определенных операций над объектом и обработка возникающих исключений, если таковые появятся ) и 10-й пункт "Дзена" Python - "Ошибки никогда не должны умалчиваться".
Иногда вместо явной обработки исключений удобнее использовать блок with
(доступен, начиная с Python 2.5).
[править] Итераторы
В программах на Питоне широко используются итераторы. Цикл for
может работать как с последовательностью, так и с итератором. Все коллекции, как правило, предоставляют итератор. Объекты определённого пользователем класса тоже могут быть итераторами. Подробнее об итераторах можно узнать в разделе о функциональном программировании. Модуль itertools
стандартной библиотеки содержит много полезных функций для работы с итераторами.
[править] Генераторы
Одной из интересных возможностей языка являются генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также сопрограммы). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений. См. пример: генератор чисел Фибоначчи.
При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода next()
, неявно вызываемого в for
цикле) генератор продолжает исполнение функции от предыдущей точки останова до следующего оператора yield
или return
.
В Python 2.4 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:
>>> sum(i for i in xrange(1, 100) if i % 2 != 0) 2500
В этом примере суммируются все нечетные числа от 1 до 99.
Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода send()
и возбуждать в его контексте исключения с помощью метода throw()
.
[править] Управление контекстом выполнения
В Python 2.5 появились средства для управления контекстом выполнения блока кода - оператор with
и модуль contextlib
. См. пример.
Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, не зависимо от возбужденных в блоке исключений или операторов return
: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т.п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.
[править] Декораторы
Начиная с версии 2.4 Python позволяет использовать т.н. декораторы (PEP318) (не следует путать с одноименным шаблоном программирования) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). После долгих дебатов для декораторов стал использоваться символ @
в строках, предшествующих определению функции или метода. Следующий пример содержит описание статического метода без применения декоратора:
def myWonderfulMethod(): return "Некоторый метод" myWonderfulMethod = staticmethod(myWonderfulMethod)
и с помощью декоратора:
@staticmethod def myWonderfulMethod(): return "Некоторый метод"
Декоратор является ничем иным как функцией, получающей в качестве первого аргумента декорируемую функцию или метод. Декораторы можно считать элементом аспектно-ориентированного программирования.
[править] Другие возможности
В Python есть еще несколько возможностей, отличающих его от многих других языков высокой гибкостью и динамичностью.
В Питоне класс является объектом, а в операторе определения класса можно использовать выражения в списке родительских классов.
def getClass(): return dict class D(getClass()): pass d = D()
Можно модифицировать многие объекты во время исполнения, например классы:
>>> class X(object): pass ... >>> y = X() >>> y.wrongMethod() # такого метода пока нет Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'X' object has no attribute 'wrongMethod' >>> X.wrongMethod = lambda self : 'im here' # добавим его >>> y.wrongMethod() # т.к. доступ к методу приводит к поиску по __dict__ класса, 'im here' # то wrongMethod становится доступным всем экземплярам
[править] Библиотеки
[править] Стандартная библиотека
Богатая стандартная библиотека является одной из привлекательных сторон Питона. Здесь имеются средства для работы со многими сетевыми протоколами и форматами интернета, например, модули для написания HTTP-серверов и клиентов, для разбора и создания почтовых сообщений, для работы с XML и т. п. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др.
[править] Модули расширения и программные интерфейсы
Помимо стандартной библиотеки существует множество библиотек, предоставляющих интерфейс ко всем системным вызовам на разных платформах; в частности, на платформе Win32 поддерживаются все вызовы Win32 API, а также COM в объёме не меньшем, чем у Visual Basic или Delphi. Количество прикладных библиотек для Python в самых разных областях без преувеличения огромно (веб, базы данных, обработка изображений, обработка текста, численные методы, приложения операционной системы, и т. д.)
Для Python принята спецификация программного интерфейса к базам данным DB-API 2 и разработаны соответствующие этой спецификации пакеты для доступа к различным СУБД: PostgreSQL, Oracle Database, Sybase, Firebird (Interbase), Informix, Microsoft SQL Server, MySQL и sqlite. На платформе Windows доступ к БД возможен через ADO. Коммерческий пакет mxODBC для доступа к СУБД через ODBC для платформ Windows и Юникс разработан eGenix. Для Питона написано много ORM: SQLObject, SQLAlchemy, Dejavu,Django ORM и другие.
Библиотека NumPy для работы с многомерными массивами позволяет достичь производительности научных расчётов, сравнимой со специализированными пакетами. SciPy использует NumPy и предоставляет доступ к обширному спектру математических алгоритмов (матричная алгебра (BLAS level 1-3, LAPACK), БПФ). Numarray специально разработан для операций с большими объемами научных данных.
На стадии разработки (PEP333) находится WSGI v 1.0 - интерфейс шлюза с веб-сервером (Python Web Server Gateway Interface).
Питон предоставляет простой и удобный программный интерфейс C API для написания собственных модулей на языках Си и Си++. Такой инструмент как SWIG позволяет почти автоматически получять привязки для использования C/C++ библиотек в коде на Питоне. Возможности этого и других инструментов варьируются от автоматической генерации (C/C++/Fortran)-Python интерфейсов по специальным файлам (SWIG, pyste[2], SIP[3], pyfort[4]), до предоставления более удобных API (boost::python[5], CXX[6] и др.). Так-же есть модули позволяющие встраивать код на С/C++ прямо в исходные файлы Python, создавая расширения «на лету» (pyinline[7], weave[8]).
Другой подход состоит во встраивании интерпретататора Питон в приложения. Питон легко встраивается в программы на Java, C/C++, Ocaml. Взаимодействие приложений на других языках программирования возможно также с помощью CORBA, xml-rpc, SOAP, COM.
С помощью Pyrex возможна компиляция Python-подобного (добавлена возможность типизации) языка кода в эквивалентный С код и связывание с внешними модулями. Экспериментальный проект shedskin[9] [10] предполагает создание компилятора для трансформации неявно типизированных Python программ в оптимизированный С++ код, но на начало 2007 год проект далек от завершения.
Питон и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Питон в коммерческих разработках и не налагает никаких обязательств кроме указания авторских прав.
[править] Графические библиотеки
С Питоном поставляется библиотека tkinter на основе Tcl/Tk для создания кроссплатформенных программ с графическим интерфейсом. Данная библиотека является фактически стандартом для GUI-приложений, написанных на Питоне.
Однако в силу разных причин всё больше людей при написании GUI программ отдают предпочтение библиотеке wxPython (wxPython), основанной на библиотеке wxWidgets. Также часто используются библиотеки PyGTK и PyQT (PyQt).
Для создания игр и различных приложений требующих нестандартного интерфейса удобным является использование библиотеки Pygame ([11]). Стоит заметить, что pygame это не только графическая библиотека, с её помощью можно управлять звуком и изображениями, воспроизводить видео. С помощью данной библиотеки на Питоне можно создавать приложения использующие аппаратное ускорение графики OpenGL, предоставляя при этом более высокоуровневый интерфейс чем PyOpenGL, которая копирует семантику С OpenGL. Есть также PyOgre обеспечивающая привязку к Ogre - высокоуровневой объектно ориентированной библиотеке 3D графики.
[править] Примеры программ
В статье Python примеры программ собраны примеры небольших программ демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.
[править] Профилирование и оптимизация кода
В стандартной библиотеке Питон имеется профайлер (модуль profile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit
. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов конкатенации строк более эффективен:
from timeit import Timer variants = ( """s = "" for i in range(10000): s += str(i)""", # А. инкрементальные конкатенации в цикле """s = [] for i in range(10000): s.append(str(i)) s = "".join(s)""", # Б. через промежуточный список и метод join """s = "".join([str(i) for i in range(10000)])""", # В. списковое выражение и метод join """s = "".join(str(i) for i in range(10000))""") # Г. генераторное выражение и метод join for v in variants: print Timer(v).timeit(200)
Как и в любом языке программирования, в Питоне имеются свои приемы оптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг сдругом) критериев (увеличение быстродействия, уменьшение объема требуемой оперативной памяти, компактность исходного кода и т.д.). Чаще всего программы оптимизируют по времени исполнения. Здесь есть несколько очевидных правил:
- Не нужно оптимизировать программу, если скорость ее выполнения достаточна
- Используемый алгоритм имеет определенную временную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм
- Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Питоне есть встроенная функция sort().
- Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них
Питон имеет следующие особенности и связанные с ними правила оптимизации:
- Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обрабатывать ту же последовательность в цикле вызовом функции
- Старайтесь вынести из глубоко вложенного цикла все, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным, или чем доступ к полям.
- Оптимизатор psyco [12] может помочь ускорить работу модуля программы при условии, что модуль не использует динамичных свойств языка Питон
- В случае, если модуль проводит массированную обработку данных, и оптимизация алгоритма и кода не помогает, можно переписать критические участки, скажем, на языке Си или Pyrex
Инструмент под названием Pychecker [13] поможет проанализировать исходный код на Питоне и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузки и т.п). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[14] призван решать близкие задачи но имеет уклон в сторону проверки стиля кода.
[править] Сравнение с другими языками
Наиболее часто Питон сравнивают с Perl и Ruby. Эти языки также являются интерпретируемыми и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Питон может успешно применяться для написания сценариев (скриптов). Как и Ruby, Питон является хорошо продуманной системой для ООП.
Средства функционального программирования частично позаимствованы из Scheme и Haskell.
В среде коммерческих приложений скорость выполнения программ на Питон часто сравнивают с Java-приложениями. Результаты одной из попыток сравнения можно найти здесь.
Несмотря на то, что Питон обладает достаточно самобытным синтаксисом, одним из принципов дизайна этого языка является принцип наименьшего удивления.
[править] Недостатки
См. также cписки недостатков языка Python здесь(англ.) и здесь(англ.).
[править] Низкое быстродействие
Питон, как и многие другие интерпретируемые языки, не применяющие, например, JIT-компиляторов, имеют один общий недостаток — сравнительно невысокую скорость выполнения программ. Однако, в случае с Питон считается, что этот недостаток с лихвой компенсируется уменьшением времени разработки программы и в сообществе Питон-программистов преобладает мнение, что на Питоне можно решить задачу в среднем в 3—5 раз быстрее чем на Си++ или Java. Стоит отметить, что в последних версиях CPython программы на Питоне выполняются значительно быстрее, чем в предыдущих. Сохранение байт-кода (файлы .pyc и .pyo) позволяет интерпретатору не тратить лишнее время на перекомпиляцию кода модулей при каждом запуске, в отличие, например, от языка Perl. Кроме того, существует специальная библиотека psyco [15], позволяющая несколько оптимизировать выполнение программ (однако приводящая к увеличению потребления оперативной памяти).
Нужно отметить, что уже существуют проекты реализаций языка Питон, вводящие высокопроизводительные виртуальные машины в качестве компилятора заднего плана. Примерами таких реализаций может служить PyPy, базирующийся на LLVM; более ранней инициативой является проект Parrot. Не без основания ожидается, что использование высокопроизводительных машин типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где т. н. низкая вычислительная производительность во основном преодолена.
Множество программ/библиотек для интеграции с другими языками программирования (см. выше) предоставляют возможность использовать другой язык для написания критических участков.
В самой популярной реализации языка Питон интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях Tcl, Forth, LISP или Lua, что ограничивает его применение во встроенных системах. Тем не менее Питон нашёл применение в КПК и некоторых моделях мобильных телефонов.
[править] Отсутствие статической типизации
Отсутствие статической типизации является не столько недостатком интерпретатора, сколько выбором дизайнера языка. Дело в том, что что в Python принята так называемая "Утиная типизация". В силу этого типы передаваемых значений недоступны на этапе компиляции и ошибки вроде AttributeError
могут возникать во время исполнения. Отсутствие статической типизации также одна из основных причин низкого быстродействия.
Существуют модули, которые позволяют контролировать типы параметров функций на этапе исполнения, например typecheck. Добавление необязательной статической типизации возможно в Python3000, см. PEP-3100 и PEP-3107 (опциональная типизация параметров функции).
Отсутствие статической типизации и некоторые другие причины не позволяют реализовать в Python механизм перегрузки функций на этапе компиляции. Возможности Python позволяют реализовать динамическую перегрузку на этапе исполнения, что, конечно, замедляет вызов, так как разрешение производится при каждом обращении и является, в общем случае, довольно сложной процедурой. Отсутствие перегрузки в Python стараются компенсировать использованием виртуальных функций.
len = lambda x : x.__len__()
# это только пример
Реализации и описание : [16], [17], пример реализации простой перегрузки так-же есть в примерах программ на Python. Планы по поддержке перегрузки в Python3000 PEP-3107.
[править] Невозможность модификации встроенных классов
По сравнению с Ruby и некоторыми другими языками в Python отсутствует возможность модифицировать встроенные классы, такие как int, str, float, list
и другие, что однако позволяет Python потреблять меньше оперативной памяти и быстрее работать. Дополнительной причиной, проводящей к такому ограничения является невозможность согласовать такое поведение с C API, использующим для ускорения приведение встроенных типов к соответствующим C типам, вместо манипуляций непосредственно с Python int
или str
объектами.
[править] Реализации
CPython является основной, но не единственной реализацией языка программирования Python. Существуют так-же следующие реализации:
Jython — реализация Python, использующая JVM в качестве среды исполнения. Позволяет прозрачно использовать Java библиотеки.
IronPython — Python для Microsoft .NET и Mono. Компилирует Python программы в MSIL, таким образом предоставляя полную интеграцию с .NET системой.
Stackless - также написанная на С реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии. На некоторых задачах несколько быстрее CPython.
Python for .NET - еще одна реализация Python для .NET, однако не компилирующая Python код в MSIL, а только предоставляет интерпретатор, написанный на C#. Позволяет использовать .NET сборки из Python кода.
PyPy - Реализация Python, написанная на Python. Позволяет легко проверять новые возможности. В PyPy кроме стандартного CPython включены возможности Stackless, Psyco, модификация AST "на лету" и многое другое. В проект интегрированы возможности анализа Python кода и трансляция в другие языки и байтокоды виртуальных машин (C, LLVM, Javascript, .NET(с версии 0.9.9)). Начиная с 0.9.0 возможна полностью автоматическая трансляция интерпретатора на C в результате чего достигается скорость приемлемая для использования (в 2-3 раза медленее чем CPython при отключенном JIT для версии 0.9.9). JIT активен начиная с версии 1.0, вышедшей 28.03.2007.
[править] Применение
Питон — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык реализации, для создания расширений, для интеграции приложений. См. также Python software(англ.).
[править] Проекты, реализованные на Питоне
[править] Веб-программирование и веб-проекты
- Zope — сервер для построения CMS, порталов и собственных видов веб-приложений, а также платформа для их разработки
- Plone — система управления содержимым вебсайтов (CMS) на платформе Zope
- Django — среда для разработки веб-приложений
- Karrigell — среда для разработки веб-приложений (Karrigell)
- Turbogears — среда для разработки веб-приложений
- CherryPy — среда для разработки веб-приложений
- Webware — среда для разработки веб-приложений
- web.py — среда для разработки веб-приложений (web.py)
- Mailman — популярная программа для работы со списками рассылки
- MoinMoin — вики-движок для интранета и интернета
- PlanetPlanet — Движок для синдикации rss-потоков
- reddit — Движок блога реализован на web.py
- SEPY — редактор языка ActionScript
[править] Графика
- Skencil — многоплатформенный редактор векторной графики для unix-систем
- imgSeek — программа для ведения архива фотографических изображений с поиском по содержимому и множеством других возможностей. (imgSeek)
[править] Разработка программного обеспечения
- Buildbot — система для управления сборкой исходных текстов
- Trac — викивики и багтрекер интегрированные с системой управления версиями Subversion
- ViewCVS — программа для просмотра репозиториев CVS через веб-браузер
- Bazaar — децентрализованная система управления версиями (eng) (RCS)
- Mercurial — децентрализованная система управления версиями (RCS)
- PythonCard — среда визуальной разработки
- Boa — среда визуальной разработки
[править] Другие области применения
- BitTorrent — клиент-сервер для одного из протоколов файлообменных сетей
- Portage — система пакетов, используемая Gentoo Linux
- Anaconda — инсталлятор операционной системы Fedora/RedHat Linux и некоторых других дистрибутивов базирующихся на RedHat (написан с использованием Python, C, PyGTK)
- PEAK Набор инструментов для создания корпоративных систем с компонентной архитектурой
[править] Проекты, использующие Питон как сценарный язык
- Википедия использует Питон для написания ботов
- Civilization IV — популярная стратегическая игра.
- Blender — кросплатформенный 3D редактор, Питон использован для поддержки скриптов-плагинов
- Gimp — растровый графический редактор, для написания скриптов используется Питон
- Vim — текстовый редактор, предоставляет богатый API для автоматизации и расширения функциональности
- WinCVS — GUI для работы с системой CVS в ОС Windows, использует Питон для поддержки скриптов
- Среда рабочего стола GNOME использует Питон для написания плагинов для ряда приложений:
- Gnumeric — табличный процессор для UNIX-систем
- Desktop — поисковый инструмент среды GNOME
- Gedit — текстовый редактор
- Greyhawk: Temple of Elemental Evil — игра для ОС Windows от фирмы Troika Games, Питон использован для скриптовой поддержки игрового движка
- Battle for Wesnoth — пошаговая стратегическая игра «Битва за Веснот», Питон используется для создания скриптов AI
- Minions of Mirth - MMORPG игра, Питон использован как основной язык для написания логики сервера и клиента.
[править] Компании и организации, интенсивно использующие Питон
- Институт космического телескопа (STSCI)
- Яндекс
- NASA
- CERN
- Nokia
- Industrial Light & Magic
- DreamWorks
- Firaxis Games
- Apple Computer использует Python и Twisted для разработки сервера календарей iCal
[править] Ссылки
[править] Информация по различным аспектам языка
- www.python.org - Официальный сайт языка Python
- www.python.com.ua - Портал Python-программистов(на русском)
- www.python.ru - Pусский сайт, посвящённый Python
- zope.net.ru/ - Русскоязычный форум по Python и Zope
- PLEAC-Python - Коллекция решённых на Питоне задач (удобна для сравнения с другими языками)
- Python Wiki
- Python 2.4 Quick Reference - Быстрое ознакомление с Питоном 2.4
- Русские python Wiki - Python Wiki для русскоязычных пользователей
- Python Wiki (на русском) - Русская версия Python Wiki
- http://python.borda.ru - Русскоязычный форум, посвященный языку Python
- pydev.ru/forum - Форум русскоязычных python программистов
- exception.org.ua - Бесплатный семинар по языку Python в Киеве. Проводится раз в два месяца.
- http://www.pythons60.culturakbr.ru - Программирование на Python для мобильных устройств
[править] Расширения и библиотеки для Python
- Форумы - Форумы по Jython и IronPython на русском.
- Vaults of Parnassus, The Python Cheese Shop - хранилища модулей и готовых программ
- SciPy - Scientific tools for Python - набор библиотек для научных приложений
- Psyco - JIT-компилятор для Python, позволяющий увеличить скорость работы программ в 3-10 раз
- pygame.org - библиотека для написания игровых приложений на языке Python
[править] Литература
[править] На русском языке
- Бизли, Д.М. Язык программирования Python. Справочник. -- ДиаСофт, 2000;
- Лейнингем, ван, Иван. Освой самостоятельно Python за 24 часа. -- СПб.: Вильямс;
- Пилгрим М. Вглубь языка Python [18];
- Россум, ван, Г., Дрейк, Ф.Л.Дж., Откидач Д.С. и др. Язык программирования Python. -- СПб.: АНО "Институт логики". Невский Диалект, 2001 (не издано, черновик);
- Спикльмайр С. и др. Zope. Разработка Web-приложений и управление контентом. -- М.: ДМК., 2003;
- Сузи, Р.А. Python. - СПб.: БХВ-Петербург, 2002;
- Сузи, Р.А. Язык Python и его применения: Учебное пособие. -- М.: ИНТУИТ, БИНОМ. Лаборатория знаний, 2006
- Чаплыгин, А.Н. и др. Учимся программировать вместе с Питоном. [19]; (в процессе написания)
[править] На английском языке
- Mark Lutz, David Ascher. Learning Python. O'Reilly, 1999;
- Mark Hammond, Andy Robinson. Python Programming on Win32. O'Reilly, 2000;
- David Beazley, Guido Van Rossum. Python: Essential Reference. New Riders Publishing, 1999;
- John E. Grayson. Python and Tkinter Programming. Manning Publications Company, 1999;
- Frederik Lundh. Python Standard Library. O'Reilly & Associates, 2001;
- Amos Latteier, Michel Pelletier. The Zope Book. New Riders Publishing, 2001;
- Mark Lutz. Programming Python (2nd Edition). O'Reilly & Associates, 2001;
- Wesley J. Chun. Core Python Programming. Prentice Hall PTR, 2000;
- Christopher A. Jones, Fred L. Drake. Python & XML. O'Reilly & Associates, 2001;
- Martin C. Brown. Python: The Complete Reference. McGraw-Hill Professional Publishing, 2001;
- Alan Gauld. Learn to Program Using Python: A Tutorial for Hobbyists, Self-Starters, and Those Who Want to Learn the Art of Programming. Addison-Wesley Pub CoAddison-Wesley Pub Co, 2001;
- Ivan Van Laningham. Teach Yourself Python in 24 Hours. Sams, 2000;
- Gupta R. Making use of Python
- Jones, Drake. Python and XML
Эта статья входит в число избранных статей русскоязычного раздела Википедии. |