Сегодня ненароком попал на ссылку про питон в википедии... вроде и раньше там был, но буковок довольно много и не читал. А тут пролистал. Не пожалел. Был в шоке.
Читать рекомендую исключительно по оригиналу, удобнее конечно будет с компа, но суть можно понять и с оперы мини!.. здесь текст привожу лишь для оправдания ссылки на источник и, конечно, чтобы все это могли увидеть.
Материал из Википедии — свободной энциклопедии
Семантика: мультипарадигменный: императивный, объектно-ориентированный, функциональный, аспектно-ориентированный
Тип исполнения: интерпретация байтокода, компиляция в MSIL
Появился в: 1990 г.
Автор(ы): Гвидо ван Россум
Типизация данных: строгая, динамическая
Основные реализации: CPython, Jython, IronPython, PyPy, Stackless
Создан под влиянием: ABC, Modula-3, Lisp, Smalltalk, C, Java, Icon
Оказал влияние на: Ruby, Boo, Groovy, ECMAScript
Python ([ИpajёYn]; пайтон, питон) — мультипарадигменный язык программирования высокого уровня с динамической типизацией, автоматическим управлением памятью и удобными высокоуровневыми структурами данных, такими как словари (хеш-таблицы), списки, кортежи. Большая часть реализаций, в том числе и референсная CPython, - интерпретаторы. Поддерживает классы, модули (которые могут быть объединены в пакеты), обработку исключений, а также многопоточные вычисления. Питон обладает простым и выразительным синтаксисом. Язык поддерживает несколько парадигм программирования: структурное, объектно-ориентированное, функциональное и аспектно-ориентированное.
CPython существует для большинства активно используемых платформ. Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные. Текущая версия 2.5.1 вышла 18 апреля 2007 года. Есть реализации интерпретаторов для JVM, MSIL ( в том числе с возможностью компиляции ), LLVM и других.
Python — активно развивающийся язык программирования, новые версии ( с добавлением/изменением языковых свойств ) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.Содержание [убрать]
1 Философия
2 История
2.1 Влияние других языков на Python
3 Портируемость
4 Типы и структуры данных
5 Синтаксис и семантика
5.1 Операторы
5.2 Выражения
5.3 Имена
5.4 Строки документации
5.5 Директивы
6 Возможности
6.1 Интерактивный режим
6.2 Объектно-ориентированное программирование
6.3 Функциональное программирование
6.4 Модули и пакеты
6.5 Интроспекция
6.6 Обработка исключений
6.7 Итераторы
6.8 Генераторы
6.9 Управление контекстом выполнения
6.10 Декораторы
6.11 Другие возможности
7 Библиотеки
7.1 Стандартная библиотека
7.2 Модули расширения и программные интерфейсы
7.3 Графические библиотеки
8 Примеры программ
9 Профилирование и оптимизация кода
10 Сравнение с другими языками
10.1 Недостатки
10.1.1 Низкое быстродействие
10.1.2 Отсутствие статической типизации
10.1.3 Невозможность модификации встроенных классов
10.1.4 Глобальная блокировка интерпретатора (GIL)
11 Реализации
12 Python 3.0
13 Специализированные подмножества/расширения Python
14 Применение
14.1 Проекты, реализованные на Питоне
14.1.1 Веб-программирование и веб-проекты
14.1.2 Графика
14.1.3 Разработка программного обеспечения
14.1.4 Другие области применения
14.2 Проекты, использующие Питон как скриптовый язык
14.3 Компании и организации, интенсивно использующие Питон
15 Ссылки
15.1 Информация по различным аспектам языка
15.2 Расширения и библиотеки для Python
16 Литература
16.1 На русском языке
16.2 На английском языке
Философия
Вольный перевод Дзэна Питона (автор Тим Пейтерс):
Красивое лучше уродливого.
Явное лучше неявного.
Простое лучше сложного.
Сложное лучше усложнённого.
Последовательное лучше вложенного.
Разрежённое лучше, чем плотное.
Удобочитаемость существенна.
Частные случаи не настолько существенны, чтобы нарушать правила.
Однако практичность важнее (синтаксической) чистоты.
Ошибки никогда не должны умалчиваться.
Если явно не указано — умалчивать.
В случае неоднозначности сопротивляйтесь искушению угадать.
Должен существовать один — и, желательно, только один — очевидный способ.
Хотя он может быть с первого взгляда неочевиден, если ты не голландец (намёк на Гвидо ван Россума)
Сейчас — лучше, чем никогда.
Но никогда — часто бывает лучше, чем прямо сейчас.
Если реализацию идеи тяжело объяснить, она плоха.
Если реализацию идеи легко объяснить, она может быть хороша.
Пространства имён — великолепная идея, их должно быть много!
Английский (оригинальный) вариант «Дзэна Питона» выдаётся интерпретатором Питона по команде import this (работает один раз).
История
Питон создал в начале 1990-х гг. сотрудник голландского института CWI Гвидо ван Россум (Guido van Rossum). Для распределенной ОС Amoeba требовался расширяемый скриптовый язык, и Гвидо начал писать Питон на досуге, заимствовав некоторые наработки для языка АВС (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). Затем язык начал свободно распространяться через Интернет и понравился другим программистам. С самого начала Питон проектировался как объектно-ориентированный язык.
.py
Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного сериала 70-х годов «Воздушный цирк Монти Пайтона». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с фильмом — пиктограммы файлов в KDE или в Microsoft Windows и даже эмблема на сайте python.org изображают змеиные головы.
Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Питона. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Питона см. [1].
Начата работа над Python 3000 (или Python 3.0) — версией языка, в которой будут устранены многие недостатки в дизайне с максимально возможным сохранением совместимости со старыми версиями Питона. Первая альфа-версия, Python 3.0a1, выпущена 31 августа 2007 года.
Влияние других языков на Python
Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования:
ABC — отступы для группировки операторов, высокоуровневые структуры данных (map) [2] [3] (фактически, Python создавался как попытка исправить ошибки, допущенные при проектировании ABC);
Modula-3 — пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp);
Си, C — некоторые синтаксические конструкции (как пишет сам Гвидо В. Р. — он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у C программистов к Python [4]);
Smalltalk — объектно-ориентированное программирование;
Lisp — отдельные черты функционального программирования (lambda, map, reduce, filter и другие);
Fortran — срезы массивов, комплексная арифметика;
Miranda — Списочные выражения;
Java — модули logging, unittest, threading (часть возможностей оригинального модуля не реализована), xml.sax стандартной библиотеки, совместное использование finally и except при обработке исключений, использование @ для декораторов;
Icon — генераторы.
Большая часть других возможностей Python (например байт-компиляция исходного кода) также была реализована раннее в других языках.
Портируемость
Питон портируем и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, все варианты UNIX (включая GNU/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, основные из которых IronPython и Python.Net .
Типы и структуры данных
Python поддерживает динамическую типизацию, то есть, тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Питоне имеются встроенные типы: булевский, строки, Unicode-строки, целые числа произвольной точности, числа с плавающей запятой, комплексные числа и некоторые другие. Из коллекций Питон поддерживает кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии 2.4, множества. Все значения в Питоне являются объектами, в том числе функции, методы, модули, классы.
Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.
Все объекты делятся на ссылочные и атомарные. К атомарным относятся int,long,complex и некоторые другие. При присваивании атомарные объекты копируются в то время как для ссылочных копируется только указатель на объект, таким образом обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты - изменяемыми. Кортеж в Питоне является, по сути, неизменяемым списком.
Синтаксис и семантика
Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Питоне программ легко читаем. См. также 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 new sorted list
В интерактивном режиме доступен отладчик pdb и система помощи (вызывается по help()). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.
Кроме встроенной, существует и улучшенная интерактивная оболочка IPython.
Объектно-ориентированное программирование
Основная статья: Объектно-ориентированное программирование на Питоне
Дизайн языка Питон построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. Поддерживается:
Наследование, в том числе множественное.
Полиморфизм (все функции виртуальные).
Инкапсуляция (два уровня — общедоступные и скрытые методы и поля).
Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
Перегрузка операторов (всех, кроме is,'.','=' и символьных логических).
Свойства (имитация поля с помощью функций).
Управление доступа к полям (эмуляция полей и методов, частичный доступ, и т. п.).
Методы для управления наиболее распространёнными операциями (истинностное значение, 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.exc_info(). Кроме значения исключения Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback.
В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяют ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «Дзена» Python — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «утиной типизации».
Иногда вместо явной обработки исключений удобнее использовать блок with (доступен, начиная с Python 2.5).
Итераторы
В программах на Питоне широко используются итераторы. Цикл for может работать как с последовательностью, так и с итератором. Все коллекции, как правило, предоставляют итератор. Объекты определённого пользователем класса тоже могут быть итераторами. Подробнее об итераторах можно узнать в разделе о функциональном программировании. Модуль itertools стандартной библиотеки содержит много полезных функций для работы с итераторами.
Генераторы
Одной из интересных возможностей языка являются генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также сопрограммы). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений. См. пример: генератор чисел Фибоначчи.
При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода next(), неявно вызываемого в for цикле) генератор продолжает исполнение функции от предыдущей точки останова до следующего оператора yield или return.
В Python 2.4 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:
>>> sum(i for i in range(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 "", line 1, in
AttributeError: 'X' object has no attribute 'wrongMethod'
>>> X.wrongMethod = lambda self : 'im here' # добавим его
>>> y.wrongMethod() # так как доступ к методу приводит к поиску по __dict__ класса,
'im here' # то wrongMethod становится доступным всем экземплярам
Библиотеки
Стандартная библиотека
Основная статья: Стандартная библиотека Python
Питон поставляется «с батарейками в комплекте».
Богатая стандартная библиотека является одной из привлекательных сторон Питона. Здесь имеются средства для работы со многими сетевыми протоколами и форматами интернета, например, модули для написания 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. На платформе Microsoft Windows доступ к БД возможен через ADO. Коммерческий пакет mxODBC для доступа к СУБД через ODBC для платформ Windows и UNIX разработан 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[5], SIP[6], pyfort[7]), до предоставления более удобных API (boost::python[8], CXX[9] и др.). Существуют модули, позволяющие встраивать код на С/C прямо в исходные файлы Python, создавая расширения «на лету» (pyinline[10], weave[11]).
Другой подход состоит во встраивании интерпретатора Питон в приложения. Питон легко встраивается в программы на Java, C/C , Ocaml. Взаимодействие Python-приложений с другими системами возможно также с помощью CORBA, xml-rpc, SOAP, COM.
С помощью Pyrex возможна компиляция Python-подобного (добавлена возможность типизации) языка кода в эквивалентный С код и связывание с внешними модулями.
Экспериментальный проект shed skin([12]) предполагает создание компилятора для трансформации неявно типизированных Python программ в оптимизированный С код. Начиная с версии 0.22 shed skin позволяет компилировать отдельные функции в модули расширений. Полная компиляция (по состоянию на 1 июля 2007 года) далека от завершения.
Питон и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Питон в коммерческих разработках и не налагает никаких обязательств кроме указания авторских прав.
Графические библиотеки
С Питоном поставляется библиотека tkinter на основе Tcl/Tk для создания кроссплатформенных программ с графическим интерфейсом.
Однако в силу разных причин всё больше людей при написании GUI программ отдают предпочтение библиотеке wxPython (wxPython), основанной на библиотеке wxWidgets. Также часто используются библиотеки PyGTK и PyQT (PyQt). PyQt так же предоставляет широкие возможности по работе с базами данных, графикой и сетями при помощи возможностей библиотеки Qt.
Для создания игр и различных приложений, требующих нестандартного интерфейса, удобно применять библиотеку Pygame ([13]). Стоит заметить, что pygame предоставляет обширные средства работы с мультимедиа: с её помощью можно управлять звуком и изображениями, воспроизводить видео. Предоставляемое pygame аппаратное ускорение графики OpenGL имеет более высокоуровневый интерфейс по сравнению с PyOpenGL, копирующей семантику С-библиотеки для OpenGL. Есть также PyOgre, обеспечивающая привязку к Ogre — высокоуровневой объектно-ориентированной библиотеке 3D-графики.
Примеры программ
В статье Python примеры программ собраны примеры небольших программ демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.
Профилирование и оптимизация кода
В стандартной библиотеке Питон имеется профайлер (модуль profile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов конкатенации строк более эффективен:
from timeit import Timer
def case1(): # А. инкрементальные конкатенации в цикле
s = ""
for i in range(10000):
s = str(i)
def case2(): # Б. через промежуточный список и метод join
s = []
for i in range(10000):
s.append(str(i))
s = "".join(s)
def case3(): # В. списковое выражение и метод join
return "".join([str(i) for i in range(10000)])
def case4(): # Г. генераторное выражение и метод join
return "".join(str(i) for i in range(10000))
for v in range(1,5):
print (Timer("func()","from __main__ import case%s as func" % v).timeit(200))
Как и в любом языке программирования, в Питоне имеются свои приемы оптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения. Здесь есть несколько очевидных правил:
Не нужно оптимизировать программу, если скорость её выполнения достаточна
Используемый алгоритм имеет определённую временную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм
Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Питоне есть встроенная функция sort().
Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них
Питон имеет следующие особенности и связанные с ними правила оптимизации:
Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции
Старайтесь вынести из глубоко вложенного цикла все, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным, или чем доступ к полям.
Оптимизатор psyco [14] может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Питон
В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать критические участки, скажем, на языке Си или Pyrex
Инструмент под названием Pychecker [15] поможет проанализировать исходный код на Питоне и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т.п). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[16] призван решать близкие задачи но имеет уклон в сторону проверки стиля кода.
Сравнение с другими языками
Наиболее часто Питон сравнивают с Perl и Ruby. Эти языки также являются интерпретируемыми и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Питон может успешно применяться для написания скриптов (сценариев). Как и Ruby, Питон является хорошо продуманной системой для ООП.
Средства функционального программирования частично позаимствованы из Scheme и Icon.
В среде коммерческих приложений скорость выполнения программ на Питон часто сравнивают с Java-приложениями. Результаты одной из попыток сравнения можно найти здесь.
Несмотря на то, что Питон обладает достаточно самобытным синтаксисом, одним из принципов дизайна этого языка является принцип наименьшего удивления.
Недостатки
См. также cписки недостатков языка Python здесь(англ.).
Низкое быстродействие
Питон, как и многие другие интерпретируемые языки, не применяющие, например, JIT-компиляторов, имеют один общий недостаток — сравнительно невысокую скорость выполнения программ (shootout.alioth.debian.org — наиболее полное и достаточно объективное сравнение характеристик различных интерпретаторов и компиляторов, постоянно обновляется) . Однако, в случае с Питон считается, что этот недостаток с лихвой компенсируется уменьшением времени разработки программы и в сообществе Питон-программистов преобладает мнение, что на Питоне можно решить задачу в среднем в 3—5 раз быстрее чем на Си или Java. Стоит отметить, что в последних версиях CPython программы на Питоне выполняются значительно быстрее, чем в предыдущих. Сохранение байт-кода (файлы .pyc и .pyo) позволяет интерпретатору не тратить лишнее время на перекомпиляцию кода модулей при каждом запуске, в отличие, например, от языка Perl. Кроме того, существует специальная библиотека psyco [17], позволяющая несколько оптимизировать выполнение программ (однако приводящая к увеличению потребления оперативной памяти).
Нужно отметить, что уже существуют проекты реализаций языка Питон, вводящие высокопроизводительные виртуальные машины в качестве компилятора заднего плана. Примерами таких реализаций может служить PyPy, базирующийся на LLVM; более ранней инициативой является проект Parrot. Не без основания ожидается, что использование высокопроизводительных машин типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где т. н. низкая вычислительная производительность в основном преодолена.
Множество программ/библиотек для интеграции с другими языками программирования (см. выше) предоставляют возможность использовать другой язык для написания критических участков.
В самой популярной реализации языка Питон интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях Tcl, Forth, LISP или Lua, что ограничивает его применение во встроенных системах. Тем не менее Питон нашёл применение в КПК и некоторых моделях мобильных телефонов.
Отсутствие статической типизации
Отсутствие статической типизации является не столько недостатком интерпретатора, сколько выбором дизайнера языка. Дело в том, что в Python принята так называемая «Утиная типизация». В силу этого типы передаваемых значений недоступны на этапе компиляции и ошибки вроде AttributeError могут возникать во время исполнения. Отсутствие статической типизации также одна из основных причин низкого быстродействия.
Существуют модули, которые позволяют контролировать типы параметров функций на этапе исполнения, например typecheck. Добавление необязательной статической типизации параметров функции запланированно для Python3000, см. PEP-3107 и PEP-3100. При этом однако непосредственно интерпретатор не будет проверять типы, а только добавлять соответствующую информацию к метаданным функции, для её (информации) последующего использования модулями расширений.
Отсутствие статической типизации и некоторые другие причины не позволяют реализовать в Python механизм перегрузки функций на этапе компиляции. Возможности Python позволяют реализовать динамическую перегрузку на этапе исполнения, что, конечно, замедляет вызов, так как разрешение производится при каждом обращении и является, в общем случае, довольно сложной процедурой. Отсутствие перегрузки в Python стараются компенсировать использованием виртуальных функций.
len = lambda x : x.__len__() # это только пример
Реализации и описание : [18], [19], пример реализации простой перегрузки также есть в примерах программ на Python. Планы по поддержке перегрузки в Python3000 PEP-3124, PEP-3107.
Невозможность модификации встроенных классов
По сравнению с Ruby и некоторыми другими языками в Python отсутствует возможность модифицировать встроенные классы, такие как int, str, float, list и другие, что однако позволяет Python потреблять меньше оперативной памяти и быстрее работать. Еще одной причиной введения такого ограничения является необходимость согласования с модулями расширения. Многие модули (в целях оптимизации быстродействия) преобразуют Python-объекты элементарных типов к соответствующим C типам вместо манипуляций с ними посредством C API.
Глобальная блокировка интерпретатора (GIL)
GIL (Global Interpreter Lock) - проблема присущая CPython, Stackless и PyPy, но отсутствующая в Jython и IronPython. При своей работе основной интерпретатор Python постоянно использует большое количество потоково-небезопасных данных. В основном это словари, в которых хранятся атрибуты объектов. Для избежания разрушения этих данных при совместной модификации из разных потоков перед началом исполнения нескольких инструкций (по умолчанию 100) поток интерпретатора захватывает GIL, а по окончанию освобождает. Вследствие этой особенности в каждый момент времени может исполнятся только один поток Python кода, даже если в компьютере имеется несколько процессоров или процессорных ядер (GIL также освобождается на время выполнения блокирующих операций, таких как ввод-вывод, изменения/проверка состояния синхронизирующих примитивов и других, таким образом если один поток блокируется, другие могут исполняться). Была предпринята попытка перехода к более гранулярным синхронизациям, однако из-за частых захватов/освобождений блокировок эта реализация оказалась слишком медленной. В ближайшем будущем переход от GIL к другим техникам не предполагается. Следует отметить что эта проблема существует в большинстве других распространенных интерпретируемых языков, что позволяет предположить отсутствие эффективного решения.
Если необходимо параллельное исполнение нескольких потоков Python кода, то можно воспользоваться процессами, например модулем processing, который имитирует семантику стандартного модуля threading, но использует процессы вместо потоков. Есть множество модулей, упрощающих написание параллельных и/или распределенных приложений на Python, таких как parallelpython, Pypar,pympi и других. GIL освобождается при исполнении кода большинства расширений, например numpy/scipy, позволяя на время расчетов исполняться другому Python потоку. Другим решением может быть использование IronPython или Jython, лишенных данного недостатка.
Реализации
CPython является основной, но не единственной реализацией языка программирования Python. Существуют также следующие реализации:
Jython — реализация Python, использующая JVM в качестве среды исполнения. Позволяет прозрачно использовать Java библиотеки. Домашняя страница.
IronPython — Python для Microsoft .NET и Mono. Компилирует Python программы в MSIL, таким образом предоставляя полную интеграцию с .NET системой. Домашняя страница.
Stackless — также написанная на С реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии.
Python for .NET — ещё одна реализация Python для .NET . В отличии от IronPython эта реализация не компилирует 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 3.0
Новая версия языка находится на ранней стадии разработки. Информацию о наиболее видимых изменениях можно получить на сайте разработчиков. Новая версия исправляет некоторые дефекты дизайна языка, поэтому код для предыдущих версий Python требует небольших изменений. В частности, вместо оператора print нужно использовать одноименную функцию или запись на стандартный вывод sys.stdout.write(). Все строки стали Unicode-строками и более не требуют указания u"", однако, весь код, который использовал кодировки или двоичные данные в строках, потребует изменений, так как для двоичных данных предусмотрен отдельный тип bytes. Методы словаря (.keys(), .items(), .values()) вместо списка будут возвращать специальный объект-представление (англ. view), который можно преобразовать в список с помощью list().
Специализированные подмножества/расширения Python
На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них:
RPython - созданная в рамках проекта PyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. RPython код можно компилировать во множество других языков/платформ - C,javascript,Lisp,.NET[20],LLVM. На RPython написан интерпретатор PyPy.
Pyrex - ограниченная реализация Python , но несколько меньше, чем RPython. PyReX расширен возможностями статической типизации типами из языка С и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений,компилируется в код на языке С.
Cython - расширенная версия Pyrex.
pyastra - компилятор Python кода в ассемблер для PIC архитектуры.
Проект shed-skin - предназначен для компиляции неявно статически типизированного Python кода в оптимизированный код на языке С , проект далёк от завершения.
Применение
Питон — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык реализации, для создания расширений, для интеграции приложений. См. также Python software(англ.).
Проекты, реализованные на Питоне
Веб-программирование и веб-проекты
Zope — сервер для построения CMS, порталов и собственных видов веб-приложений, а также платформа для их разработки
Plone — система управления содержимым вебсайтов (CMS) на платформе Zope
Django — среда для разработки веб-приложений
Karrigell — среда для разработки веб-приложений (Karrigell)
Turbogears — среда для разработки веб-приложений
Pylons — среда для разработки веб-приложений ([21])
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 — децентрализованная система управления версиями
PythonCard — среда визуальной разработки
Boa — среда визуальной разработки
Другие области применения
BitTorrent — клиент-сервер для одного из протоколов файлообменных сетей
Portage — система пакетов, используемая Gentoo Linux
Anaconda — инсталлятор операционных систем Fedora, Red Hat Enterprise Linux, и некоторых других дистрибутивов, базирующихся на последнем (написан с использованием Python, C, PyGTK)
yum — высокоуровневая система управления пакетами ПО, надстройка над RPM, применяется в Fedora/RHEL.
PEAK — Набор инструментов для создания корпоративных систем с компонентной архитектурой
EVE Online — массовая многопользовательская он-лайн ролевая игра (MMORPG) на космическую тему.
Проекты, использующие Питон как скриптовый язык
Википедия использует Питон для написания ботов
Civilization IV — популярная стратегическая игра.
Blender — кросплатформенный 3D редактор, Питон использован для поддержки скриптов-плагинов
Gimp — растровый графический редактор, для написания скриптов используется Питон
Vim — текстовый редактор, предоставляет богатый API для автоматизации и расширения функциональности
WinCVS — GUI для работы с системой CVS в ОС Microsoft Windows, использует Питон для поддержки скриптов
Среда рабочего стола GNOME использует Питон для написания плагинов для ряда приложений:
Gnumeric — табличный процессор для UNIX-систем
Desktop — поисковый инструмент среды GNOME
Gedit — текстовый редактор
Greyhawk: Temple of Elemental Evil — игра для ОС Windows от фирмы Troika Games, Питон использован для скриптовой поддержки игрового движка
Battle for Wesnoth — пошаговая стратегическая игра «Битва за Веснот», Питон используется для создания скриптов AI
Minions of Mirth — MMORPG игра, Питон использован как основной язык для написания логики сервера и клиента.
Eve-online — MMORPG игра, для написания сервера и клиента использован Stackless Python
OpenOffice — набор офисных программ, альтернатива Microsoft Office, Питон используется для написания скриптов наравне с Basic, javascript, BeanShell
Maya — Hi-end редактор трёхмерной графики. Начиная с версии Maya 8.5 Питон используется в качестве скриптового языка наравне с MEL (Maya Embedded Language). Кроме того, Maya Python API (интерфейс к C Maya API для Питон) используется для создания расширений к Maya, а также для пакетной обработки данных.
Компании и организации, интенсивно использующие Питон
Институт космического телескопа (STSCI)
Google
Яндекс
NASA
CERN
Nokia
Industrial Light & Magic
DreamWorks
Firaxis Games
... дальше статья не помещается
Похожие файлы
Создание и управление интерфейсом на Android с Python. Часть 4
Программирование для смартфоновФруктовый Python! Часть 2.
Программирование для смартфоновЗдесь находятся
всего 0. За сутки здесь было 0 человек
Комментарии 11
Чувак это прикольно я вообще отстал в развитие из-за армейкиюПродолжай в том же духе.Уважуха
Только недавно я научился подписывать программы, а теперь хочу научиться работать с питоном. Прочитал всю статью, но ничего толкового не извлек для себя. Может кто-нибудь посоветует, с чего начинать? Да так, чтоб полегче было. Заранее спасибо.
да есть надчем порозмышлять
0 ответить