История языка Python
Эдуард Пройдаков
Популярные языки программирования и их рейтинг
Как пел Булат Окуджава, «на каждого умного по ярлыку повешено было однажды». Программистов всегда интересовало, насколько популярен тот или иной язык программирования. Во-первых, популярность ЯВУ, на котором они пишут, в какой-то степени стимулирует заниматься этим языком и гарантирует, что интерес к нему есть у работодателей. Поэтому уже много лет в мире используется рейтинги ЯВУ. Существует множество организаций, которые по различным критериям рассчитывают такие рейтинги для многих ЯВУ и с некоторой периодичностью публикуют их в отраслевой прессе и на Интернет-ресурсах. Мне представляется наиболее интересным рейтинг ЯВУ, который публикует компания TIOBE Software. Индекс популярности TIOBE строит на основе анализа статистики поисковых запросов в таких системах, как Google, Google Blogs, Yahoo!, Wikipedia, MSN, YouTube, QQ, Sohu, Bing, Amazon и Baidu. В 2022 году рейтинг выделил перемещение языка Python с третьего места, которое он занимал в 2021 году, на первое место в списке. Языки Си и Java, соответственно, сместились на второе и третье места. Кто интересуется этим вопросом, может легко найти полную таблицу TIOBE в Интернете. Поскольку она постоянно изменяется, то нет особого смысла фиксировать в статье конкретное текущее значение индекса популярности. Здесь принципиально важно, что Python уже давно находится в первой десятке ЯВУ по популярности, а сейчас добрался до первого места. Чтобы вам данная оценка не показалось предвзятой, приведу результат другого уважаемого рейтинга, который проводит журнал IEEE Spectrum. В его рейтинге язык Python также занимает первое место, второе у Java, третье у C и четвёртое – у C++. Рейтинг IEEE Spectrum публикуется Институтом инженеров электротехники и электроники (IEEE) и учитывает сочетание 12 метрик, полученных из 10 различных источников. Посмотрим, что же обеспечило Python такую популярность.
Python как явление
Python – свободно распространяемый, интерпретируемый, высокоуровневый ЯВУ общего назначения с динамическими семантикой и типизацией.
Популярность Python можно объяснить обширной экосистемой пакетов (их много тысяч), таких как NumPy, и фреймворков, таких как PyTorch, которые помогают обрабатывать числа, анализировать данные. Существуют пакеты для Python практически на все случаи жизни. Python с успехом применяется в самых различных областях приложений: в качестве языка сценариев при написании Интернет-приложений, для системного администрирования, доставки веб-контента, в разработке компьютерных игр, он один из основных ЯВУ для систем машинного обучения и прочее, прочее. Python может использоваться как для веб-разработки так и для создания настольных приложений. Он хорошо документирован и поддерживается на многих платформах (Windows, Mac OS X, Linux и др.), поскольку эталонная версия интерпретатора написана на языке C. Интерпретатор Python и библиотеки доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформах и могут свободно распространяться.
Python поддерживает несколько парадигм программирования: императивное, модульное, объектно-ориентированное, функциональное программирование, поддерживает модули и пакеты, поощряя повторное использование кода.
В своем интервью, опубликованном в книге «Пионеры программирования», отвечая на вопрос : «Почему Вы решили поддерживать несколько парадигм?» автор языка Гвидо ван Россум более сдержан. Он говорит:
На самом деле, это не так: Python в некоторой мере поддерживает процедурное программирование и объектно-ориентированное. Python лишь в очень малой степени поддерживает функциональное программирование, но при этом не похож ни на один из реальных функциональных языков – и никогда не будет похож. Для функциональных языков характерно, чтобы как можно больше работы делалось на этапе компиляции, – «функциональность» означает, что компилятор может провести оптимизацию с уверенной гарантией отсутствия побочных эффектов, если только о них не сказано явно. Для Python характерно, что компилятор может быть самым простым и тупым, и официальная семантика этапа исполнения препятствует таким умствованиям компилятора, как распараллеливание циклов или превращение рекурсии в циклы.
Понятна принципиальная позиция Гвидо, который отстаивает достоинства Python как интерпретируемого языка, отличающая его от большинства компилируемых языков. Но для программиста, создающего приложение, наличие в языке рекурсии, функций высших порядков, лямбда-определений функций, наличие встроенных функций map и reduce позволяет использовать функциональный стиль программирования вне зависимости от того, будет ли созданный код компилироваться или интерпретироваться.
Существуют две главные разновидности Python, не обладающие обратной совместимостью: Python версии 2.x, который достаточно широко применялся, в то время как версия Python 3.х взята за основу для дальнейшего развития языка (последняя версия Python 3.13 вышла 7 октября 2024г. На сайте https://www.python.org/downloads/ дана таблица с датами выпуска всех версий Python). Различия в синтаксисе между Python 2 и Python 3 предельно простые и потребуют незначительных изменений исходных текстов. Версия 2.7, последняя в ветке Python 2.x, поддерживалась до 2020 года.
Существует несколько оболочек для работы с интерпретатором языка в интерактивном режиме: достаточно простая оболочка Python shell, развитая интегрированная среда разработки (IDE, integrated development environment), которая называется Spyder и другие.
То, что Python интерпретируемый язык, существенно снижают его быстродействие по сравнению с компилируемыми языками C и C++, поэтому производительность кода, написанном на чистом Python является его слабостью.
Рассмотрим некоторые критерии, характеризующие ЯВУ.
Напишем программу на конкретном ЯВУ, а потом перепишем её на ассемблере компьютера, на котором будет выполняться программа на ЯВУ. Среднее отношение числа машинных команд в программе, построенной компилятором (интерпретатором) по программе на ЯВУ, к числу команд в программе на ассемблере данного компьютера задаёт так называемый коэффициент расширения – КР кода. Хотя мы предполагаем, что оба фрагмента написаны опытными программистами, но обычно для этой цели делается чисто статистическая выборка из разных программ. Коэффициент расширения для каждого языка зависит от характера программы, поэтому говорят о диапазоне его значений. Так для хороших реализаций компиляторов с языка Си он был всего 1,2 –1,4, т. е. программа на Си будет в лучшем случае в 1,2 раза длиннее соответствующей программы на Ассемблере. Однако для ЯВУ более высокого уровня чем Си, коэффициент расширения может быть существенно хуже (больше) и доходить до 10. По этому критерию чистый Python далеко не чемпион.
КР кода не следует путать с КР операторов языка – сколько машинных команд потребуется для реализации оператора высокоуровневого языка. Считается, что для Си этот коэффициент равен 6. Чем выше КР оператора языка, тем выше уровень данного ЯВУ. Этот критерий характеризует краткость кода, создаваемого на ЯВУ. Чемпионом по этому критерию является функциональный язык APL, где была придумана специальная нотация записи функций аббревиатурного типа. Но, если не принимать во внимание этот своеобразный язык, то по краткости кода Python один из явных чемпионов.
Отвечая на вопрос: «Как краткость кода на Python влияет на сопровождение программы?»,
Гвидо отметил:
Я слышал об исследованиях и отдельных свидетельствах, указывающих на то, что количество ошибок на одну строку кода оказывается довольно постоянной величиной, не зависящей от языка программирования. Поэтому язык вроде Python, приложение на котором обычно оказывается гораздо меньше, чем та же функциональность, реализованная на C++ или Java, должен значительно облегчить сопровождение этого приложения. Конечно, из этого должно следовать, что каждый отдельный программист реализует больший объем функциональности. Это отдельная тема, но все равно результат говорит в пользу Python.
Для программистов КР кода не столь важен. Время выполнения важнее длины программы.
Для ускорения программ на Python, он сделан расширяемым – для выполнения критичных операций с максимальной скоростью в него можно добавлять новые встраиваемые функции или модули на С. Можно также вставить интерпретатор языка Python в приложение, написанное на C. Таких чудес в Python очень много. Но вернёмся непосредственно к языку – его версии 3.х.
Python как ЯВУ
Синтаксис Python простой и понятный, поэтому Python считается одним из самых лёгких для изучения.
Python отличается от других ЯВУ тем, что использует отступы для группировки инструкций в блоки кода вместо ключевых слов либо фигурных скобок.
Отсутствие предварительных объявлений переменных, возможность не задавать типы параметров функций, другие приёмы способствуют краткости кода. Утверждается, что объём исходного текста на языке Python обычно составляет треть эквивалентного текста на языках C++ или Java.
Типы данных
Числа
Иерархия числовых типов в Python 3 показана на рис. 1

Рис. 1 Иерархия числовых типов.
Арифметические операции определены над всеми числовыми типами. Над интегральными типами определены также логические операции.
Важно отметить, что целые числа в Python 3, в отличие от большинства других ЯВУ, поддерживают длинную арифметику (её ещё называют бесконечнозначной). Разумеется, это требует больше памяти. Во многих ЯВУ такая возможность реализуется в виде специальной библиотеки. Действительные и комплексные числа представлены в Python в виде чисел с плавающей запятой; для них используется стандартное представление, поддерживаемое аппаратурой.
Последовательности
Сложные типы, допускающие индексацию при обращении к элементам, являются потомками последовательности. Иерархия таких типов показана на рис. 2.

Рис. 2 Иерархия типов – наследников типа Последовательности
Последовательности представлены как изменяемыми, так и неизменяемыми типами. Заметьте, строки и кортежи (tuples) относятся к неизменяемым типам. Все операции, изменяющие значение строки или кортежа, создают новый объект, сохраняя неизменным состояние исходного объекта.
В список разрешается добавлять новые элементы или удалять существующие. Список – это динамически изменяемая структура данных.
Важно отметить, что в Python нет массивов – там, где в обычном языке используется массив, в Python используется более сложная структура данных – список. Это удобно, но отражается на производительности. При необходимости работать с массивами подключается пакет numpy.
Кортеж – это неизменяемый список, значение которому присваивается один раз. У кортежей есть различные полезные свойства, например, кортежи позволяют присваивать значение нескольким переменным одновременно (производить распаковку кортежа). Гвидо ван Россум считает, что для неизменяемых данных кортеж «самый быстрый тип данных».
Словари
Словарь в Python – это коллекция пар (уникального ключа и связанного с ним значения). Словарь похож на список, но порядок элементов в нем не имеет значения, и они выбираются не по индексу (смещению), а по ключу, который обычно представляет собой строку, но может быть элементом другого типа, например целым числом. В других языках, например в Ruby, словари называются ассоциативными массивами, хэшами или хэш-таблицами.
Множество
Множество – это структура данных, эквивалентная понятию множества в математике. Она похожа на список, но в этой структуре хранятся только уникальные значения, при этом порядок хранения элементов в множестве неопределён.
Над множествами определены основные операции: объединение (|), пересечение (&), разность (-). Операции соответствуют операциям над множествами, принятыми в математике, и имеют тот же смысл. Операции хороши тем, что позволяют строить выражения над множествами. Приоритеты операций при вычислении выражения также соответствуют общепринятым правилам. Операция пересечения множеств, воспринимаемая как умножение, имеет более высокий приоритет и выполняется раньше, чем операции разности и объединения, воспринимаемые как операции сложения.
Объявления и переменные
Переменная в Python это нетипизированная ссылка. Python нарушает правило, приличествующее достойному строго типизированному языку программирования, когда переменная в операторе присваивания не может появиться, если ранее она не была объявлена с указанием её типа. Имя в операторе присваивания заранее не объявляется. В операторе присваивания имя связывается с объектом, получая его тип и значение. В следующем операторе присваивания это же имя может быть связано с объектом совсем другого типа.
Отсутствие строгой типизации переменных не позволяет выполнять статический контроль типов, обнаруживая многие ошибки на этапе компиляции программы (которая в Python, впрочем, не делается, поскольку Python – интерпретируемый язык). Этот недостаток с точки зрения строго типизированных языков Python сумел превратить в достоинство. Отсутствие типизации переменных облегчает работу в Python программе с объектами, созданными в другом языке программирования.
Операторы языка
В состав операторов языка конечно же входят три основных оператора – присваивания, выбора и цикла. Не останавливаясь на рассмотрении вариаций оператора присваивания и выбора, чуть подробнее поговорим об операторе цикла, который имеет три основные формы:
-
for <item> in <collection>:
-
for <index> in range():
-
while <условие>:
Первая форма позволяет выполнить итерирование коллекции, когда элемент item последовательно пробегает все значения коллекции вплоть до её исчерпания. В роли коллекции может выступать список, кортеж, множество, строка, файл, множество ключей словаря, но не сам словарь.
Вторая форма используется тогда, когда коллекция индексируемая и нам необходимо работать с индексами элементов. Функция range, имеющая от одного до трёх параметров, позволяет генерировать необходимое множество индексов.
Цикл for в языке Python является обобщением оператора цикла for each, существующего во многих языках программирования.
Третья форма цикла – это классический универсальный цикл while, который может работать во всех ситуациях.
Python. Достоинства и недостатки
Рассмотрим пример (пример предоставлен Владимиром Биллигом), на котором продемонстрируем некоторые достоинства и недостатки программ, написанных на чистом Python.
К достоинствам Python относится то, что проекты можно создавать, используя разные стили программирования. Основным стилем программирования является модульное программирование. Каждый проект состоит из одного или нескольких модулей. В классических языках ООП основной единицей является класс. Некоторые классы могут быть модулями, существующими в единственном экземпляре без возможности создавать объекты – многочисленные экземпляры класса. В Python некоторые модули могут быть оформлены как классы, но основной единицей проектирования остается модуль.
Каждый модуль сохраняется в отдельном файле. Открывая новый файл, по сути, создаем модуль с пустым содержанием.
Синтаксически каждый модуль содержит определения глобальных переменных, методов и исполняемого кода. Правила стиля требуют, чтобы модуль начинался с определения предложений импорта пакетов, используемых в модуле, за которыми следуют определения переменных и методов, далее следует исполняемый код. Метода main, типичного для многих языков программирования, в Python нет. Исполняемый код модуля – это, по сути, тело метода main.
Приведем пример модуля, названного Test_list:
#Модуль Test_list - демонстрация работы со списками Python
from time import time
def create_transform_list(N):
"""
Создание и трансформация списка
"""
#генератор списка N нечетных чисел
odd_list = [2 * x + 1 for x in range(N)]
#удаление первого и последнего элемента, используя срез списка
#odd_list = odd_list[1 : N-1]
#вставка на первое место числа 777
#odd_list.insert(0, 777)
return odd_list
def test():
for pow in range(3, 7):
N = 10 ** pow
start = time()
for i in range(N):
create_transform_list(N)
finish = time()
print (N, finish - start, end =", ")
#исполняемый код
test()
В соответствии с правилами стиля в примере используются комментарии. Строчные комментарии начинаются символом #, заголовочные блочные комментарии начинаются и заканчиваются тройными кавычками.
Модуль начинается, как и положено, предложением импорта, импортирующим из пакета time метод time, возвращающий текущее время.
Два метода модуля начинаются ключевым словом def. Первый из этих методов – create_ transform_list – это функция, создающая список из N элементов, где N – аргумент функции. Второй метод – это тест, проверяющий работоспособность построенного метода и оценивающий время его работы.
Исполняемый код состоит из одной строчки – вызова теста на исполнение.
Рассмотрим код первого модуля. Первая исполняемая строка позволяет создать список первых N нечётных чисел. Для этого применяется уникальная конструкция языка Python, называемая генератором списка. Генератор способствует краткости кода – одна строка эквивалентна программному фрагменту из нескольких строк. В данном случае генератор в цикле создает коллекцию из N натуральных чисел, применяя к каждому из этих чисел функцию, преобразующее элемент коллекции в соответствующее нечётное число. Синтаксис генератора позволяет включать в конструкцию и фильтр на элементы исходной коллекции.
Генераторы Python – одна из любимых конструкций программистов, которые, несмотря на призывы классиков, предпочитают загадочный краткий код простому, понятному, но длинному коду.
Есть шуточная гипотеза, что популярность языка С++ во многом обязана элегантной конструкции x++, которая дала название языку, заменив название: «язык С с классами».
Следующие за генератором две строки метода демонстрируют методы работы со списком. В частности, используется конструкция, называемая срезом списка, для того чтобы удалить из списка первый и последний элементы. Метод insert позволяет динамически изменять список вставляя новый элемент в заданную позицию.
Метод test, включённый в состав модуля позволяет проверить корректность работы основного метода, создающего и трансформирующего список. Его главная задача оценить время работы основного метода в зависимости от размера списка.
Несмотря на кажущуюся простоту основного метода, дождаться завершения работы теста практически не удастся, поскольку потребуется десятки часов работы компьютера. В реальное время результаты могут быть получены для относительно небольших значений N.
Дело в том, что все используемые операции – генерация списка, получение среза, вставка элемента имеют линейную сложность O(n). Поэтому сложность теста, где эти операции выполняются в цикле по N, будет квадратичной.
Высокое время выполнения программ, написанных на чистом Python, при обработке данных большого размера – это один из недостатков Python.
Тем не менее, именно Python часто применяется для работы с большими данными. Но в этом случае используются пакеты, написанные не на Python, оптимизированные специально для работы с большими данными. Язык Python в этом случае используется как оболочка, склеивающая разноязычные пакеты.
История языка
Python создан в конце 1980-х годов (представлен в 1991 г.) голландским программистом Гвидо ван Россумом (Guido van Rossum) в Национальном научно-исследовательском институте математики и компьютерных наук в Нидерландах.

Рис. 3. Создатель языка Python, Гвидо ван Россум
С тех пор Python развивался при поддержке тех организаций, в которых Гвидо работал. Название языку было дано в честь популярного британского комедийного шоу “Летающий цирк Монти Пайтона” (Monty Python's Flying Circus). Язык развивается как ПО с открытыми исходными текстами (open source) под управлением некоммерческой организации Python Software Foundation с участием сообщества программистов со всего мира (её президентом является Гвидо ван Россум. До 2018 года его звали великодушным пожизненным диктатором (Benevolent Dictator For Life, BDFL), потому что он полностью контролировал развитие Python).
В течение последних нескольких лет корпорация Microsoft вносит свой существенный вклад в проект Faster Python, проект, запущенный создателем Python Гвидо ван Россумом в 2021 году, вскоре после того, как Microsoft наняла его в качестве выдающегося инженера (distinguished engineer). Создатель Python хотел, чтобы язык был в два раза быстрее, чем тот гигант, которым он является. Марк Шеннон, один из ключевых участников CPython (или Core Python), в 2020 году составил план реализации для ускорения CPython в пять раз. Core Python – это эталонная реализация Python, на которой основаны другие варианты, такие как Anaconda, ориентированная на задачи науки о данных. Проект требует большой работы по оптимизации библиотек и интерпретатора языка. Отмечу, что эта работа ведётся и версия 3.11 на стандартном наборе тестов на 10-60% быстрее, чем Python 3.10 (в среднем достигнуто ускорение в 1,22 раза). Важно, что разработки ван Россума, несмотря на его работу в Microsoft, находятся в открытом доступе в репозитории GitHub и все желающие могут их использовать в своих проектах.
Развитию Python способствует процесс сбора PEP (предложений по развитию Питона) от членов сообщества разработчиков ПО на этом языке.
Заметьте, слово «pep» символично – в переводе с английского оно означает «энергия», «Бодрость духа», так что предложения по развитию языка придают языку необходимую энергию.
Эти предложения рассматриваются и те, которые удовлетворяют ряду требований, могут быть приняты.
Питон работает под очень многими операционными системам и на многих аппаратных платформах.
Существуют несколько альтернативных реализаций языка – Jython, IronPython и другие. Подмножеством Python является язык MicroPython (МикроПитон) – упрощённая реализация языка программирования Python 3, включающая небольшую часть стандартной библиотеки Python и оптимизированная для работы на микроконтроллерах, в средах с ограниченными ресурсами. MicroPython может быть скачан в исходных текстах, а также поставляется десятками вендоров в виде прошивок для множества типов микроконтроллеров, позволяющих управлять практически любыми видами электронного оборудования.
В последние годы для написания программ стали активно применяться большие языковые модели, так и модели, специализированные для этой цели. Мой коллега провёл эксперимент, в котором LLM за три дня написала на ЯВУ программу в три тысячи строк. В ней было много лишнего, но, во всяком случае, программы длинной до 600 строк LLM пишут достаточно уверенно. Это существенно меняет стиль и скорость разработки приложений, в США уже влияет на число вакансий для программистов и требования к ним.
Литература.
-
Рик Гаско. Простой Python просто с нуля. –М.: СОЛОН-Пресс, –2019. –256 с.
-
Пол Бэрри. Изучаем программирование на Python. –М.: Издатальство “Э”. –2017. –624 с.
Автор искренне благодарен Владимиру Биллигу, инициировавшему написание этой статьи, её первому читателю и критику.
Об авторе: Директор Виртуального Компьютерного Музея
Помещена в музей с разрешения автора
6 марта 2025