Питон для чего нужен – как побочный проект одного разработчика стал популярнейшим языком программирования / Habr

Содержание

Где применяется Python: 3 основных назначения языка | Статья

Прежде чем начать изучать тот или иной язык программирования, люди обычно задумываются, как потом смогут применить свои знания и навыки на практике. Что касается Python, этот язык общего назначения пригодится во множестве различных сфер. Разработчик и основатель стартапа CS Dojo Ек Суги рассказал о трёх самых частых способах использования Python.

Читать далее

Иллюстрация: Ек Суги

Фреймворки, основанные на Python, такие как Django и Flask, в последнее время приобрели широкую популярность среди веб-разработчиков. Эти фреймворки позволяют создавать серверный код (backend-код) на Python, который выполняется на сервере, в отличие от frontend-кода, исполняемого на пользовательских устройствах и в браузерах.

Для чего нужны веб-фреймворки

Веб-фреймворки упрощают разработку серверной логики: обработку URL, обращение к базам данных, создание HTML-файлов, которые видят в браузерах пользователи.

Какие фреймворки для веб-разработки лучше использовать

Два наиболее популярных веб-фреймворка для  Python — Django и Flask. Их рекомендуется использовать начинающим разработчикам.

В чём разница между Django и Flask

Отличную статью в ответ на этот вопрос подготовил Гарет Дуайер.

Основные различия:

  • Flask — простой и гибкий фреймворк с очень подробными настройками. Пользователь может сам решать, как реализовывать те или иные вещи.
  • Django предоставляет полный функционал для разработки приложений прямо «из коробки»: встроенный интерфейс администратора, API доступа к базам данных, ORM, и структуру каталогов для приложений и проектов.

Лучше воспользоваться:

  • Flask, если цель разработчика — опыт и возможности обучения, или же если ему нужно самостоятельно выбирать, какие компоненты использовать (например, какие применять базы данных или как взаимодействовать с ними).
  • Django, если главное — конечный продукт. Особенно, если нужно построить интуитивное приложение, например, новостной сайт, онлайн-магазин, блог, в котором пользователь сможет легко ориентироваться.

Таким образом, Flask предпочтительнее использовать новичкам, потому что этот фреймворк имеет не настолько богатый функционал, а также тем, кому важна возможность настроить его по своему усмотрению. Кроме того, благодаря своей гибкости Flask больше, чем Django, подойдёт для разработки REST API. С другой стороны, если требуется создать простой продукт, быстрее это получится сделать на Django.

Что такое машинное обучение

Машинное обучении лучше объяснять на наглядном примере. Пусть нужно разработать программу, которая автоматически распознаёт изображённые на картинках объекты. На первой картинке программа должна опознать собаку.

Иллюстрация: Ек Суги

На второй она должна распознать стол.

Иллюстрация: Ек Суги

Первый путь — написать для этого специальный код. Например, если на картинке много светло-коричневых пикселей, значит, на ней нарисована собака. Или можно найти способ распознавать границы предметов: если на рисунке много прямых линий, то это — стол.

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

В машинном обучении обычно используют алгоритм, который автоматически ищет заданный образ во входных данных. Например, можно ввести тысячу картинок с собаками и тысячу — со столами. Далее алгоритм машинного обучения выявит разницу между собакой и столом. Когда алгоритм получит новое изображение собаки или стола, то сможет идентифицировать объект.

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

  • системы распознавания лиц,
  • системы распознавания голоса,
  • рекомендательные системы сайтов вроде YouTube, Amazon или Netflix.

Самые широко известные алгоритмы машинного обучения:

  • нейронные сети,
  • глубокое обучение,
  • метод опорных векторов,
  • «случайный лес».

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

Python для машинного обучения

Для Python есть популярные библиотеки и фреймворки машинного обучения. Две самые крупные из них — scikit-learn и TensorFlow. В scikit-learn встроены некоторые общеизвестные алгоритмы машинного обучения, о которых шла речь выше. TensorFlow — более низкоуровневая библиотека, которая позволяет строить пользовательские алгоритмы.

Как изучать машинное обучение

Чтобы изучить основы этой технологии, можно пройти курсы Стэнфордского университета или Калифорнийского технологического института. Но для понимания некоторого материала понадобятся базовые знания матанализа и линейной алгебры.

Далее полученную информацию нужно закрепить на сайте Kaggle. Здесь можно соревноваться с другими разработчиками в создании лучшего алгоритма машинного обучения для различных задач. Сайт также предлагает полезные самоучители для начинающих.

В качестве примера можно взять аналитика данных воображаемой компании, занимающейся продажей товаров через интернет. Аналитик может представить результаты продаж в виде столбчатой диаграммы.

Столбчатая диаграмма 1, построенная на Python. Ек Суги

На диаграмме видно, что в заданное воскресенье покупатели мужского пола приобрели более 400 единиц товара, а женского — около 350. У специалиста может быть несколько предположений, почему возник этот разрыв.

Одно из очевидных объяснений — продукт более востребован среди мужчин, чем женщин. Другая возможная причина — недостаточно большая выборка, а разницу можно списать на случайность. Третий вариант — по какой-то причине мужчины склонны больше покупать этот продукт только в воскресенье. Чтобы понять, какое из объяснений истинно, можно нарисовать ещё одну диаграмму.

Линейная диаграмма 1, построенная на Python. Ек Суги

Необходимо принять во внимание статистику продаж не только в воскресенье, но и за всю неделю. Как видно из диаграммы, такая динамика прослеживается по всем дням. Этот небольшой анализ позволяет сделать вывод, что наиболее правдоподобная причина различия в продажах в том, что продукт просто более популярен среди мужчин, чем среди женщин.

Но если бы диаграмма выглядела так,

Линейная диаграмма 2, также построенная на Python Ек Суги

можно было бы заключить, что по той или иной причине мужчины активнее покупают этот товар только по воскресеньям.

Это очень простой пример анализа данных. И для этого компании используют в том числе Python, а для визуализации данных — библиотеку Matplotlib.

Анализ и визуализация данных на Python

Matplotlib — одна из наиболее распространённых библиотек для визуализации данных. Начинать лучше с неё потому, что она проста, а также потому, что на ней основаны некоторые другие библиотеки, например, seaborn. Поэтому знание Matplotlib поможет в будущем освоить и их.

Как изучать анализ и визуализацию данных на Python

В первую очередь нужно выучить основы. Ек Суги предлагает собственное вводное видео в анализ и визуализацию данных на Python и Matplotlib на YouTube, а также полный практический курс на образовательной платформе Pluralsight, который можно получить бесплатно после подписки на 10-дневный пробный период на сайте. После этого полезно изучить основы статистики, например, на Coursera и Khan Academy.

Что такое написание скриптов

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

Это можно либо делать вручную, либо написать незамысловатую программу (скрипт) для автоматической обработки сообщений. Для подобных задач отлично подходит Python, главным образом благодаря относительно простому синтаксису и потому, что на нём можно легко и быстро писать и тестировать небольшие проекты.

Python и встраиваемые приложения

На этом языке ведут программирование многие разработчики для Raspberry Pi и других аппаратных основ.

Python и компьютерные игры

Для разработки игр можно использовать библиотеку PyGame, хотя существуют и более популярные игровые движки. На ней можно создавать любительские проекты, но для разработки серьёзных игр стоит поискать что-то получше.

Например, можно начинать с Unity на C# — это одна из самых общеизвестных сред разработки компьютерных игр. Она позволяет создавать межплатформенные игры для Windows, Mac, iOS и Android.

Python и десктопные приложения

Десктопные приложения можно разрабатывать на Python с помощью Tkinter, но это также не самый частый выбор: разработчики приложений для ПК предпочитают языки Java, C#, и C++. В последнее время некоторые компании для этого начали применять и JavaScript. Например, десктопное приложение Slack построено во фреймворке Electron, использующем JavaScript. Этот язык даёт возможность повторно использовать код из веб-версии приложения, если такая имеется.

Python 3 или Python 2

Лучше выбрать Python 3, потому что на сегодняшний день это более современная и более востребованная версия языка.

Зачем изучать Python? | Python


Python является широко используемым, высокоуровневым языком программирования, который был назван в честь знаменитого британского комедийного телешоу «Летающий цирк Монти Пайтона». Язык Python простой по своей структуре, и в то же время невероятно гибкий и мощный. Учитывая, что код Python легко читаемый и без излишней строгости в синтаксисе, многие считают, что он является лучшим вводным языком программирования.

Python — описание языка, которое дали в Foundation описывает Python:

Python – это интерпретируемый, интерактивный, объектно-ориентированный язык программирования. Он включает в себя модули, исключения, динамическую типизацию, высокоуровневые динамические типы данных и классы. Python сочетает в себе отличную производительность с понятным синтаксисом. В нем реализованы интерфейсы ко многим системным вызовам и библиотекам, а также различным оконным системам и он расширяем с помощью C и C++. Python используется как язык расширения для приложений, которым нужен программный интерфейс. И наконец, Python — это кроссплатформенный язык: он работает на многих версиях Unix, на Mac и на компьютерах под управлением MS-DOS, Windows, Windows NT и OS/2.

Можно начать изучение с Python языка программирования. Чтобы проиллюстрировать, чем Python отличается от других вводных языков, вспомните время, когда вы были подростком.

Изучение программирования с помощью Python подобно вождению родительского минивэна. Как только вы сделаете на нем несколько кругов по парковке, вы начнете понимать, как управлять автомобилем.

Пытаться изучить программирование с помощью C (или даже ассемблера) это как, учиться водить, собирая минивэн ваших родителей. Вы застрянете в гараже на несколько лет, компонуя части вместе, и когда у вас появится полное понимание того, как работает машина, и будете способны выявлять неисправности и прогнозировать будущие проблемы, вы уже перегорите, прежде чем когда-либо сядете за руль.

Язык Python для начинающих универсален. Вы можете автоматизировать рабочие процессы, создавать сайты, а также настольные приложения и игры с помощью Python. К слову, спрос на разработчиков Python (PostgreSQL, OOP, Flask, Django) резко вырос за последние несколько лет в таких компаниях, как Instagram, Reddit, Tumblr, YouTube и Pinterest.

Python относится к высокоуровневым языкам программирования. Используя его, вы сможете создавать практически любые типы программного обеспечения. Эта универсальность поддерживает ваш интерес, так как вы разрабатываете программы и решения, ориентированные на ваши интересы, а не застреваете в дебрях языка, беспокоясь о его синтаксисе.

Язык программирования Python для начинающих является интерпретируемым, а это значит, что вам не нужно знать, как компилировать код. Поскольку этап компиляции отсутствует, возрастает производительность, а время для редактирования, тестирования и отладки в значительной мере уменьшается. Просто скачайте интегрированную среду разработки (IDE), напишите свой код и нажмите «Выполнить» (Run).

Простой, легкий в изучении синтаксис Python делает упор на читаемость и задает хороший стиль программирования. С Python вы можете выразить свою концепцию меньшим количеством строк кода. Этот язык также заставляет вас обдумывать логику программы и алгоритмы. В связи с этим он часто используется как скриптовый или интегрирующий язык (glue language), чтобы связать существующие компоненты вместе и писать большие объемы легко читаемого и работоспособного кода в короткие промежутки времени.

Нельзя назвать язык программирования в честь Монти Пайтона, не имея чувства юмора. Более того, было проведено тестирование для сравнения времени, необходимого для написания простого скрипта на различных языках (Python, Java, C, J, BASIC):

…Python требует меньше времени, меньше строк кода и меньше концептов, чтобы достичь поставленной цели… И в довершение всего, программирование на Python это весело! Веселье и частый успех порождает уверенность и интерес у студентов, которые становятся лучше подготовленными к дальнейшему изучению языка Python.

Данная публикация представляет собой перевод статьи «Why Learn Python?» , подготовленной дружной командой проекта Интернет-технологии.ру

Где применяется язык Python? Сферы применения / itProger

Благодаря проектировке Python, он способен решать частые задачи, регулярно появляющиеся перед разработчиками. В статье мы расскажем про основные сферы его применения.

Язык задействуется в широчайшем спектре сфер, к примеру:

  • управление различными компонентами ПО, в том числе разработанные на другом языке;
  • для написания отдельных приложений.

Спектр ролей не имеет ограничений, так как Python относится к многоцелевым языкам. Сложно найти приложение, для написания которого не может быть использован язык. Python используется для разработки веб-сайтов, игровых платформ, систем управления искусственным интеллектом. Существуют прецеденты использования языка в космических программах. 

Системное программирование

Не секрет, что в Python используются современные интерфейсы для манипуляции службами ОС Windows, Linux и т. п. За счёт этой способности, язык является лучшим инструментом для реализации портативных программ. Часто используется в ходе разработки приложений (командных оболочек) из сферы системного администрирования. Несколько базовых функций, доступных к выполнению посредством Python:

  • поиск файлов по каталогам;
  • открытие файлов;
  • запуск сторонних программ;
  • возможность выполнять вычисления, перенаправляя их на разные потоки и т.п.

Дополнительным преимуществом является полное соответствие основной библиотеки Python к требованиям POSIX. С учётом поддержки стандартных инструментом ОС, Python является одним из лучших языков.

Графический интерфейс

Python совмещает лёгкость работы и высокую производительность работ, что делает язык идеальным решением для создания графических интерфейсов. Язык совмещает весь набор возможностей объективно-ориентированного интерфейса tkinter. С его помощью достаточно легко реализовать портативный графический интерфейс, соответствующий стилю операционной системы.

На основании API разработаны высокоуровневые инструменты типа: Dabot и PythonCard. К каждой библиотеке есть вспомогательные инструменты, позволяющие создавать графический интерфейс эффективнее и проще:

  • для QT – PyQT;
  • для GTK – PyGtk;
  • для MFC — PyWin32;
  • для .NET – IronPython;
  • для Swing – Jython (является Java реализованным языком Python).
Веб-сценарии

Уже сегодня для языка разработано множество полезных инструментов от сторонних разработчиков, помогающих реализовать непосредственно на Python приложения по работе с сетью. Как говорится, Google в помощь. Для примера, с помощью инструмента HTMLGen, способствующего созданию HTML-кода страницы, можно писать классы под HTML прямо на Python. Посредством пакета mod_python, легко запускать сценарии под Apache и обеспечивать работоспособность шаблонов в системе Python Server Pages. Удобно, что в Jython реализована бесшовное внедрение Python/Java кода и поддерживаются апплеты серверов, доступные к выполнению на клиентской стороне.

Нельзя забывать про наличие у Python целых пакетов для программирования веб-ресурсов, среди которых:

  • TurboGears;
  • Zope;
  • Django;
  • web2py;
  • Pylons;
  • WebWare.

Перечисленные пакеты помогают быстро строить качественные и многофункциональные сайты на Python.

Интеграция дополнений

Лишь некоторые компоненты из огромного списка:

  • используя SIP и Swing, удаётся в автоматическом режиме создать код для автоматизации ручных действий по связке компилируемых дополнений на Python. Это упрощает последующее применение компонентов в сценариях;
  • посредством Cython удаётся смешивать одновременно 2 многофункциональных языка: C и Python.

Наглядный пример, в ОС Виндовс Python-сценарии способны задействовать платформы, управляющие встроенными приложениями Microsoft Excel, Word и т. п.

Работа с БД

Сегодня для Python реализован доступ к большинству базовых реляционных БД. Также в среде Python присутствует независимый программный интерфейс БД, обеспечивающий лёгкий доступ к БД посредством SQL-запросов прямо из сценариев. Разработчики Python пошли по пути унификации доступа к любым БД. 

Для иллюстрации возможностей, с помощью переносного API для унификации запросов, код практически без доработок может быть использован для БД MySQL и Oracle одновременно. Работы по перестроению минимальны – лишь изменение низкоуровневого интерфейса.

Сложные вычисления

Под Python написано расширение NumPy, предназначенное для математических подсчётов. Расширение может работать с массивами данных, интерфейсами уравнений из стандартной библиотеки и т. п. После установки NumPy, язык интегрируется с библиотеками математических формул, разработанных на любых компилируемых языках. 

Расширение делает Python сложны и в то же время удобным инструментом для программирования с использованием сложных математических вычислений. В большинстве случаев Python с рассматриваемым расширением способен стать достойной заменой C++ и FORTRAN.

Более того, вспомогательные инструменты мат. вычислений включают функцию создания анимации и прорисовки 3D объектов. Также помогают выполнять параллельные вычисления и этим список возможностей не заканчивается.

Пример, одни из популярнейших дополнений, ScientificPython и SciPy имеют отдельные библиотеки, предназначенные для выполнения научных исчислений, которые частично задействуют расширение NumPy.

Где и как учить Python?

Язык Python считается легким в изучении и многие ставят его как образец первого языка для изучения. На самом деле так и есть! Язык хорошо подходит как для написания крупных проектов, полноценного ИИ или системных программ, так и для вхождения в мир программирования. 

Для изучения Python написано сотни книг, снято тысячи уроков, но большинство из этого всего работает не эффективно и не приносит желаемого результата. Наиболее эффективными методами при изучении какого-либо языка программирования являются полноценные курсы, на которых ученик не только проходит сухую теорию, но также разбирает все на практике, общается с другими учениками, а также задает вопросы лектору.

Найти хорошие курсы сложно, но возможно. Мы расскажем про компанию Shultais Education, которая находиться на рынке уже более 3 лет и за это время обучила немалое количество людей программированию.

На сайте компании вы найдете курс по языку Python, в который входит изучение базового синтаксиса языка, знакомство и создание веб сайтов на Django, а также разбор нескольких популярных библиотек Python.

В ходе обучения вам будут доступны все видео-уроки на сайте, множество практических задач на различные темы, поддержку на форуме как от других учеников, так и от авторов курса, а также по окончанию обучения вам будет выдан сертификат про успешное окончание курса.

Курс состоит из 80 уроков, при этом уроки постоянно обновляются, чтобы вы получали лишь свежую информацию. Чтобы начать изучение Python посетите сайт компании Shultais Education и зарегистрируйтесь на курс по изучению языка Python.

Зачем нужен Питон

Есть английский язык. На нём общаются люди. А ещё – на немецком, филиппинском, испанском, греческом и прорве других.

А есть Питон (голос зануды про правильное название). Это язык, на котором человек общается с компьютером. С компьютером можно общаться на куче языков: Си, Паскаль, Хаскель, Го, Свифт, Руби, ПХП, Бейсик, Эрланг, Эр и много других.

Мы тут будем учить именно Питон. Начнём с короткого обзора того, чем он отличается от остальных языков. Делать ничего не надо: прочитал, запомнил пару пунктов и всё, можно хвастаться всем, что ты в теме (не надо так).

Лаконичность

У Питона такое сообщество, что оно не приветствует разброда в использовании языка. Стандарт написания кода – это часть языка. Философия написания кода – тоже часть языка. Поэтому два хороших программиста напишут очень похожий код: не надо тратить время на «блин, а что он тут имел в виду?…».

У Питона такой синтаксис, что он помогает писать код очень коротко. Нет лишних скобок, длинных ключевых слов, сложных трюков и всякого такого. Описать логику, перевести на английский, разбавить отступами и синтаксисом – всё, программа готова.

У Питона такая стандартная библиотека, что она помогает выполнять кучу рутинных операций. Она поможет отправить емейл, закодировать строку, поднять веб-сервер, узнать время, удалить файл, посчитать дисперсию, заархивировать файл, вытащить данные из базы данных и ещё прорву всего всего парой строк.

У Питона такое количество сторонних модулей, что можно сэкономить тысячи человеко-часов работы. Нужно написать сайт? Научить нейронную сеть разгадывать капчу? Скачать аудио из «Вконтакте»? Узнавать людей на фотографиях? Смоделировать полёт ракеты? Написать бота? Для всего этого есть готовые модули, их надо только установить и воспользоваться.

Всё это делает процесс написания кода очень быстрым.

Крутая документация

Попробуйте загуглить [python function], [python parse json] или, например [python create process]. В первых результатах будет ссылка на https://docs.python.org – сайт официальной документации.

Это потому что документация очень подробная: в ней есть материалы для новичков, доки к каждому модулю, рекомендации по использованию, подводные камни и дальнейшее чтение. И это всё – для каждой версии языка. Такой удобной и подробной документации нет ни у кого.

А ещё есть http://stackoverflow.com/ – сайт, на котором одни программисты отвечают другим программистам на вопросы о программировании. За время его существования там были заданы все возможные вопросы. Серьёзно: любой вопрос в духе «как это сделать на Питоне» или «почему этот код не работает» уже был задан, просмотрен и отвечен.

Всё это делает процесс изучения и написания кода быстрым: вся нужная информация находится на расстоянии одного удачного поискового запроса.

Какого из этих вопросов нет в официальных FAQ официальной документации?

  • Why am I getting strange results with simple arithmetic operations?
  • Why is Python installed on my machine?
  • How can I implement base abstract factory class in Python?
  • Writing C is hard; are there any alternatives?

Строгая динамическая типизация

Динамическая типизация – значит, в одной и той же переменной в разное время могут храниться значения разных типов. Сейчас – число, потом – строка, и всё – в одной переменной.

Во многих языках так нельзя: создал, мол, целочисленную переменную, вот и храни в ней целые числа. Это удобно для компьютера, но не всегда удобно для программиста.

Строгая типизация – значит, нельзя просто так производить действия с объектами разных типов. Например, строку с числом сложить не получится: сначала надо превратить строку в число, а только потом – сложить. Сам Питон такое преобразование делать не будет.

Может показаться, что это неудобно, но на самом деле это защищает от прорвы ошибок. Чтобы понять о чём речь, достаточно посмотреть на JavaScript, язык со слабой типизацией:

Автоматическое управление памятью

Управление памятью – это когда для каждой кучки данных в программе нужно руками выделить место в оперативной памяти. Следить, чтобы данные не вышли за пределы этого места. Не забыть освободить это место после того, как данные не нужны. В общем, адский геморрой.

В Питоне об этом думать не надо: язык программирования всё сделает за программиста. Правда, сделает неидеально: о том, как Питон работает с памятью, надо знать.

И ещё много всякого

Помимо перечисленного, Питон знаменит много чем ещё: отступами, интроспекцией, дзеном, портируемостью, GIL-ом, названием.

как побочный проект одного разработчика стал популярнейшим языком программирования / Habr

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



Гвидо Ван Россум в штаб-квартире Dropbox в 2014 году

В конце 1994 года группа избранных программистов с разных концов США собралась для обсуждения своего нового секретного оружия.

Барри Уорсо был одним из двух десятков разработчиков, собравшихся на самый первый воркшоп, посвящённый новому языку программирования Python, и вспоминает, насколько явным было радостное возбуждение его первых пользователей.

«Особенно мне запомнился один человек, сказавший: ’Не говорите никому, что я здесь, потому что то, что мы используем питон, является конкурентным преимуществом’. Это было их секретное оружие».

Даже на этой ранней встрече в бюро государственных стандартов США в Мэриленде, как говорит Уорсо, было очевидно, что питон предлагает нечто новое в вопросе лёгкого написания кода и простого достижения результата.

«Когда мне впервые показали питон, я знал, что это нечто особенное. Это было сочетание читаемости и радости от написания кода на питоне», — вспоминает он.

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

Питон используется для больших и малых задач профессиональными и начинающими разработчиками, и особенно популярен среди веб-разработчиков, специалистов по науке о данных и системных администраторов. Именно с помощью питона в этом году были получены первые изображения чёрной дыры, находящейся в 500 млн трлн км от нас, а также именно на питоне работают написанные на скорую руку бесчисленные скрипты на настольных компьютерах всего мира.

Питон играет главную роль в некоторых из самых известных организаций мира: помогает Netflix отправлять потоковое видео в более чем 100 млн домов по всему миру, лежит в основе феномена фотообменника Instagram и помогает НАСА исследовать космос.

Ранние годы питона


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

Этот язык программирования появился, как сторонний проект программиста из Нидерландов Гвидо Ван Россума. В конце 1980-х ван Россум работал над распределённой системой в Centrum Wiskunde & Informatica (CWI), нидерландском государственном исследовательском центре математики и информатики. Разочаровавшись недостатками существующих языков программирования, он решил сделать новый – такой, который было бы легко использовать, но при этом обладающий большими возможностями.

Для постороннего человека задача создания собственного языка программирования похожа на заявление вроде «Я построю себе самолёт», но у ван Россума, которому тогда было за 30, была определённая фора. В CWI он три года работал с командой, создавшей ABC, интерпретируемый язык программирования, поэтому у него уже было представление о том, как можно сделать интерпретатор, исполняющий инструкции программиста, и какие синтаксические строительные блоки нужны для нового языка.

Также важно понять, насколько сложно было сделать что-либо при помощи ограниченных возможностей доступных ван Россуму в то время языков программирования. Распределённая вычислительная система Amoeba, с которой он работал, требовала от него использования С или командной строки Unix – у обоих вариантов были серьёзные ограничения. С требовал от разработчиков не только борьбы со сложностями ручного управления памятью и навигации по минному полю возможных ошибок – в нём не было библиотеки кода для повседневных задач разработчика, которую можно было бы использовать многократно, из-за чего разработчикам с каждым новым проектом приходилось заново изобретать велосипед. А у командной строки Unix были свои проблемы – там было большое разнообразие инструментов для распространённых задач, но она работала так медленно, что не справлялась со сложной логикой.

Ограничения, налагаемые этими языками на разработчиков были такими, что создание своего интерпретируемого языка – который взял бы лучшие свойства у ABC – реально казалось Ван Россуму наилучшим вариантом.

«Я, в общем-то, подумал: ’Ну а почему бы мне не создать свой собственный язык’, украв идеи у ABC, но уменьшив размер проекта от того, что мы делали три года, до того, что я сам бы смог сделать за три месяца, и вот так родился питон», — говорит он. Ван Россум по-настоящему начал работать над этим в конце 1989 года, а имя позаимствовал у любимой комедийной труппы «Летающий цирк Монти Пайтона» – ассоциация со змеями и логотип с завязанным питоном появились позже – и работал над проектом по возможности.

«В то время у меня не было богатой социальной жизни. Так что, вместо того, чтобы пялиться в телек, я писал код, или иногда делал и то и то сразу», — признаётся он.

И хотя номинально он создавал питон, чтобы облегчать себе работу, ван Россум понимает, что настоящим мотивом, возможно, был вызов создания собственного языка.

«Не знаю, насколько серьёзно я верил в то, что это сделает меня более продуктивным. Думаю, что я частью просто наслаждался идеей того, чтобы начать свой проект, писать такой код, который мне хотелось, и разрабатывать его так, как я хотел. Мне нравится программировать», — говорит он.

И если для обычного человека идея создания собственного ЯП может показаться необычной, у ван Россума была неплохая компания. В конце 1980-х из-за разочарования в возможностях существующих инструментов появилось множество новых, обретших популярность языков. Знаменитое высказывание Ларри Уолла гласит, что его побудила создать язык Perl сложность решения задач, а также обилие «лени, нетерпения и высокомерия». Поиски лучшего языка для создания интерактивных инструментов проектирования интегральных схем побудили Джона Остерхаута создать Tcl.

Всего за три месяца ван Россум создал рабочий прототип интерпретируемого питона, в котором, по его словам, отсутствовали современные возможности, но в котором уже можно было узнать современную версию языка.

«В сегодняшнем питоне есть много важных абстракций, которых тогда не существовало, но язык был очень похожим», — говорит он.

«В тот момент у меня были все базовые компоненты интерпретатора и языка. Простые программы на питоне, написанные для первой версии интерпретатора, вероятно, будут работать и сегодня», — говорит он, добавляя, что функции определялись так же, отступы работали тем же образом, словари и кортежи создавались идентично, а также там была знакомая интерактивная строка ввода, где можно писать код и сразу получать результаты.

Однако когда двое его коллег взяли этот язык и сразу начали его использовать, у ван Россума не было больших ожиданий по поводу его широкого распространения – он уже знал, насколько сложно было раскрутить ЯП в предшествовавшую интернету эру.

Сегодня на то, чтобы поделиться софтом со всем миром, уходят несколько кликов. В 1980-х эта задача была гораздо сложнее, и ван Россум вспоминает сложности попыток распространить предшественника питона, ABC.

«Помню в 1985 году я впервые посетил США, поехав в отпуск с магнитной лентой в рюкзаке», — говорит ван Россум.


Гвидо ван Россум в 2001 году, когда был основан Python Software Foundation

Вооружившись адресами и телефонами людей, которые выразили интерес к ABC посредством зачатков электронной почты, существовавшей в то время – и по которой нельзя было пересылать ничего крупного, вроде исходного кода – он ездил от одного адреса к другому, раздавая плёнку. Но, несмотря на все старания, ABC так и не взлетел.

«Неудивительно, что у нас не получилось активно распространить ABC, несмотря на все его чудесные качества», — говорит он. Но интернет-революция набирала обороты, и распространять питон было уже гораздо проще – чемодан с плёнками уже не требовался.

Ван Россум выпустил питона в мир через новостную группу alt.sources в 1991 году, практически на условиях лицензии с открытым кодом – хотя такое понятие появится только через шесть лет. И хотя интерпретатор питона приходилось скачивать с сети Usenet в виде 21-й части, которые потом нужно было собрать в один файл и разархивировать, этот механизм доставки всё равно был куда как более эффективным, чем развоз физических копий, предпринятый за несколько лет до этого.

«Я надеялся на какой-то успех, но у меня уже был опыт выпуска другого проекта, который в итоге обернулся фиаско», — говорит он.

С таким опытом за плечами ван Россум не сразу сделал какие-то выводы из растущей базы пользователей питона. Постепенно он осознал, что набор популярности не прекращается, и в какой-то момент, после регулярных контактов с питон-сообществом он понял, что создал нечто, что может иметь успех.

«По-моему, понимание приходило ко мне очень медленно. После первого выпуска открытого кода я выстроил ритм выпуска следующих версий и взаимодействия с нарождавшимся питон-сообществом. И всё это ощущалось как нечто серьёзное».

Почему питон победил


После того, как язык начал набирать обороты в начале и середине 1990-х, у ван Россума появилось ощущение, что питон оказался языком, чьё время пришло.

Ван Россум считает, что в питоне разработчиков привлекало то же, что заставило его создать этот язык. Им хотелось найти скриптовый язык высокого уровня, обеспечивавший баланс между простотой использования и обилием возможностей, и не имевший таких ограничений, от которых страдала командная строка Unix при работе со сложной логикой. Им хотелось положить конец настойчивым требованиям С возиться с управлением памятью и постоянно заново писать код для одних и тех же базовых задач в начале каждого проекта.

Уорсо говорит, что питон достиг баланса в удобстве использования, не принося в жертву возможности – существовавшие в начале 1990-х языки такого предложить не могли. «Я много программировал на Perl, Tcl и C, и это было не очень интересно. Потом на сцену вышел питон, и я подумал: ’Ого, вот теперь программировать снова интересно’», — говорит он.


Барри Уорсо на первой рабочей встрече пользователей питона в 1994

Питон предлагал, и предлагает, чёткий, недвусмысленный синтаксис, в котором код группируется на блоки через отступы, что облегчает разработчикам задачу понимания кода.

Финтан Райан, директор исследований команды стратегий прикладных платформ из аналитической фирмы Gartner, говорит, что ясность кода сыграла большую роль в завоевании симпатий разработчиков, как сейчас, так и в 1990-х, хотя придание такой важности отступам разделило сообщество. «Оно предлагало очень ясный синтаксис. В других языках тоже можно было писать код так, но питон принуждал к этому автоматически. Некоторые программисты это обожают, а другие ненавидят», — говорит он.

То, что питон ставит на первое место ясный и читаемый код, не случайность – ван Россум говорил, что языки программирования нужны не только для того, чтобы говорить компьютеру, что делать, но и для передачи идей от одних разработчиков другим.

Кроме читаемости, говорит Райан, питон почти сразу предлагал встроенную функциональность, отличавшую его от других языков. «Там была такая функциональность, как классы и обработка исключений. Питон также поддерживал такие функции, как lambda, map и filter, оказавшиеся очень полезными во многих случаях», — говорит он.

Питон мог бы и не появиться, если бы популярные ЯП в 1980-х были бы лучшего качества. Одной из мотиваций ван Россума к созданию питона стала несовместимость скриптового языка Perl и распределённой вычислительной системы Amoeba, над которой он работал в CWI. «Питону повезло с тем, что Perl невозможно было портировать на Amoeba, — говорит он. – Если бы Perl удалось портировать на Amoeba, я бы никогда не задумался о создании собственного языка».

Хотя питон создал после выхода базу истинных приверженцев, в 1990-х он был аутсайдером среди ЯП. Ван Россум говорит, что за первое место соревновались Tcl/Tk и Perl, и у обоих из них была такая же цель, как у питона – простота использования и богатые возможности.

«В 90-х в первой тройке ЯП определённо первое место занимал Perl – он был чем-то вроде 400-килограммовой гориллы – затем шёл Tcl/Tk, а питон занимал скромное третье место», — говорит он.

Сегодня питон растёт быстрее всех остальных ЯП, если считать по активным разработчикам – так следует из ежегодного опроса разработчиков Stack Overflow, одного из наиболее всеобъемлющих обзоров ЯП – а Perl сжался до такого состояния, что его уже не упомянули в последнем отчёте.

Этот взрывной рост показан на графике внизу, где отмечено, как количество просмотров вопросов, связанных с питоном на сайте Stack Overflow выросло быстрее, чем количество просмотров вопросов из других языков.

Так как же питон победил своего давнего соперника, и как объяснить настолько сильно различающиеся судьбы двух ЯП? Ван Россум считает, что в частности это произошло из-за того, насколько легко поддерживать базу кода, когда она выходит за определённые рамки. «Люди считали, что Perl идеально подходил для написания скриптов в 10 строчек, — говорит он. – Но когда у вас есть 500 строк основного кода и несколько тысяч строк в библиотеках, требуется огромная дисциплина для того, чтобы код можно было поддерживать и далее. В питоне при этом, даже если у вас нет такой дисциплины, код будет достаточно легко читать и поддерживать».

Это свойство питона, комбинация простого для начинающих языка, который в то же время достаточно надёжен для того, чтобы писать на нём крупные приложения, ван Россум и относит на счёт его первоначального успеха в 1990-х.

«В интернете было несколько разработчиков – большая часть этой истории относится к ранним этапам развития интернета – которым нужно было писать всё более и более крупные приложения, и которым нравилось, что в питоне на это можно потратить гораздо меньше усилий, чем если использовать C, C++ или Java».

С ростом популярности питона в 1990-х ван Россум, всё ещё работавший в CWI, обнаружил, что его детище всё больше связывает его с людьми со всего мира. «Я сделал нечто, и оно связывало меня с людьми со всего мира – людьми из Австралии, из США, из других европейских стран. Мне это безумно нравилось», — говорит он.

Питон и веб


К середине 1990-х питон начинали использовать по-новому, от скриптов для записи и воспроизведения аудио, до первых набегов языка на веб-разработку, которая в итоге окажется главным оплотом питона.

«Одной из больших областей использования языка была веб-разработка, которая также очень сильно интересовала и меня лично, — говорит ван Россум, и добавляет, что питон начали использовать для создания бэкенд-скриптов на веб-серверах вместе с Perl и скриптами командной строки. – Можно было создавать динамические веб-страницы, и это стало одним из моих любимых применений питона».

Райан из Gartner говорит, что популярность питона среди разработчиков 1990-х закрепило то, что он стал любимым выбором для быстрого создания мощных скриптов. «То, что это был скриптовой язык с обширной функциональностью, снизило барьер вхождения для многих пользователей», — говорит он.

Кроме того, говорит Райан, ЯП был достаточно гибким, и его так легко было выучить, что он нравился очень разным пользователям с разным техническим опытом. «Сисадмины и другие люди начали использовать этот язык для автоматизации систем и программирования, разработчики – из-за таких вещей, как функциональное программирование и классы с наследованием; у Perl, к примеру, было гораздо меньше подобных возможностей, — говорит он. – После того, как люди знакомились с языком, а кривая обучения у него была довольно пологой, они очень быстро начинали выходить на высокий уровень продуктивности».

К 1994 году питон привлёк внимание Майкла Маклэя, одного из руководителей в государственном бюро стандартов США (NBS), которое сегодня преобразовалось в государственный институт стандартов и технологий (NIST). Предвосхитив любовь к питону исследователей и учёных за простоту его использования, Маклэй заинтересовался тем, смогут ли использовать питон учёные из NBS, у которых, как говорит ван Россум, «были собраны значительные объёмы данных, но не было хороших программистов».

Чтобы помочь продать идею использования питона другим членам бюро, Маклэй пригласил ван Россума, который тогда ещё работал в CWI в Нидерландах, чтобы пару месяцев поработать в NIST в качестве приглашённого исследователя. Это стало катализатором будущей эволюции питона и серьёзно изменило жизнь ван Россума.

Именно в то время была проведена первая рабочая встреча пользователей питона, которая прошла в офисах NBS, и на которой ван Россум, Барри Уорсо и другие первые энтузиасты питона встретились, чтобы обсудить, как они используют питон, и какие надежды возлагают на его будущее развитие.


Ван Россум на первой рабочей встрече пользователей питона, вместе с Уорсо и Роджером Массе, в то время работавшим вместе с Уорсо в CNRI.

В офисах NBS ван Россум познакомился с Бобом Каном, известным своей ролью в разработке одной из основных технологий интернета, протокола TCP/IP.

На встрече ван Россуму предложили поработать с Каном в корпорации государственных исследовательских инициатив (CNRI), некоммерческой исследовательской группе из Виргинии, занимавшейся стратегической разработкой сетевых технологий.

Как питон откликнулся на необходимость в новом типе ЯП, так и предложение о работе, по словам ван Россума, поступило как раз в тот момент, когда он задавался вопросами о своём будущем в CWI.

«CWI был более академической организацией, они постоянно давили на меня, чтобы я либо защитил докторскую, либо нашёл работу где-то ещё», — говорит он.

«Меня не очень радовала перспектива заниматься докторской диссертацией в 35 лет. До этого, также благодаря питону, у меня появилось несколько других возможностей, когда после нескольких телефонных звонков и времени на раздумья я решил их отмести. Но здесь мне нравились люди, мне нравилось их предложение, проект – и я воспользовался предложением».

Именно в CNRI ван Россум скомпоновал многие структуры, необходимые для управления ЯП питон, при помощи команды из таких же энтузиастов языка. Устроившись в CNRI в апреле 1995 года, ван Россум стал руководить небольшой командой разработчиков, работавших над ПО Knowbot Programs, мобильными агентами, разработанными для запуска на распределённых компьютерных системах типа интернета.

Команда работала на языке питон, и к ван Россуму присоединились Джереми Хилтон, Роджер Массе, Барри Уорсо, Кен Мангеймер и Фред Дрейк – все они позже сыграют важные роли в питон-сообществе.

«У нас получилась группа из 4-10 человек, большая часть которых работала в CNRI, и они стали ядром разработки питона», — говорит ван Россум.

Пока ван Россум работал в CNRI, эта команда помогла ему сделать сайт python.org, CVS-сервер для управления изменениями базы кода, и список рассылки для Python Special Interest Groups – групп, работавших над улучшением и поддержкой ЯП питон.

Сообщество пользователей питона с момента его выхода в 1991 году сильно выросло, и во второй половине десятилетия этот язык привлёк значительную базу пользователей со всего мира. В этот период началась формализация управления языком, разработчики основали предшественника Python Software Foundation (PSF), которая появится в 2001. С ростом сообщества проходившие два раза в год рабочие встречи по языку, начавшиеся в 1994 году, превратились в более крупные ежегодные мероприятия, а в итоге – в ежегодный PyCon от PSF, который проводится и по сей день.

К началу XXI века язык перерос возможности любого отдельного человека, крупное сообщество играло активную роль в разработке языка – долгий путь был пройден с лета 1994 года, когда ранние пользователи языка беспокоились, что с ним случится, «если Гвидо собьёт автобус».

Но ван Россум продолжал играть ключевую роль, и не перестал оставаться ядром языка – это очевидно из шутливого прозвища «великодушного пожизненного диктатора» (BDFL), существующего уже много лет.

«По большей части довольно долго я справлялся с давлением, а также выработал навыки по управлению проектами, которые позволили мне делегировать множество вещей, и дать людям контроль над их собственной судьбой», — говорит ван Россум.

Райан из Gartner говорит, что нет ничего необычного в том, чтобы создатель языка оставался его распорядителем, как Ларри Уолл с Perl и Райан Дал с Node.js, однако он уточняет, что ван Россум известен своей объективностью в управлении питоном. «Что касается направления развития проекта и управления им, все признают его очень сбалансированным», — говорит он.

Именно открытый характер разработки питона, с использованием публичных обсуждений сообщества и ключевых разработчиков, ван Россум считает решающим фактором успеха питона.

Эволюция питона


В промежуточных годах питон совершил гигантские шаги, в 2008 году был представлен модернизированный Python 3.0, а в последнее время в управлении языком наметились серьёзные изменения. Они начались в прошлом году, когда ван Россум уступил лидирующую роль на посту BDFL, после того, как сообщество разделило предложение ввести в язык присвоения в выражениях, обсуждение которых было сделано в заявке Python Enhancement Proposal PEP572.

Новую возможность ввели, чтобы писать более эффективный код, но ван Россум столкнулся с серьёзной критикой этого предложения со стороны противников изменений – некоторые из них утверждали, что его использование ухудшит читаемость кода и усложнит его поддержку.

Ван Россум говорит, что привык спорить по поводу нововведений, однако в данном случае непримиримость некоторых клеветников и характер личных оскорблений заставили его отказаться от должности.

«Меня разочаровало то, как не согласные с предложением по техническим причинам люди уходили в соцсети и начинали разглагольствовать о том, что процесс принятия решений сломан, или что я делаю серьёзную ошибку. Было такое ощущение, будто меня атакуют со спины», — говорит он.

«В прошлом всегда было ясно, что если в языке нужно было сделать изменение или улучшить какую-то возможность, то куча ключевых разработчиков соберутся и обсудят преимущества и недостатки нововведения. И тогда либо вырабатывался явный консенсус, либо всё было не так ясно, и тогда я обдумывал это предложение, и выносил решение. А с PEP572, хотя предложение и было спорным, я решил, что хочу его утвердить, и люди не согласились договориться о том, что мы не договорились. Это был не то, чтобы бунт, но мне показалось, что у меня нет доверия со стороны достаточного числа ключевых разработчиков, чтобы продолжать работу».

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

«Вероятно, всё дело в том, насколько крупным стало сообщество питона. Сложнее достичь какого-то соглашения, поскольку всегда найдутся сторонники противоположных точек зрения, что бы ты ни решил».

Ранее в этом году ключевые разработчики питона – поддерживающие и обновляющие интерпретатор CPython – выбрали управляющий совет, который должен планировать будущее языка. Туда вошли ван Россум, Уорсо и их коллеги Бретт Кэннон, Кэрол Уиллинг и Ник Коглан. Уорсо говорит, что это изменение было необходимым, чтобы управлять языком с настолько быстро растущей базой пользователей.

«Думаю, Гвидо реально казалось, что он держит на своих плечах весь мир в одиночку, — говорит он. – Это прокатывало 25 лет назад, когда сообщество питона было гораздо меньше, и язык был меньше, но сегодня это слишком много для одного человека, понимаете? Думаю, что чисто для здоровья и возможности участвовать в действиях сообщества, хорошо было распределить эту нагрузку на пятерых», — говорит Уорсо.

Первые выборы в управляющий совет будут проходить после каждого выхода новой версии питона, что, по словам Уорсо, проложит путь следующему поколению лидеров. «Если питон будет жив через 25 лет, то им уже будем управлять не мы с Гвидо, понимаете?» – говорит он.

Организацию управляющего совета приветствовало и сообщество ключевых разработчиков. Одна из них, Мариатта Виджайа, говорит, что это действие кажется шагом в верном направлении. «Управляющий совет лучше одного человека, принимающего все решения – это слишком большая ответственность и груз, — говорит она. – Это хороший признак, и благодаря этому у сообщества будет больше входящей информации».


Один из ключевых разработчиков, Мариатта Виджайа

Будущее питона


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

На встрече пользователей ЯП питон в этом году сооснователь BeeWare Рассел Кит-Мэги предупредил всех, что питон столкнётся с «экзистенциальным риском», если не улучшит поддержку мобильных и новых веб-платформ. «Телефоны и планшеты так сильно проникают на рынок, что настольным компьютерам и ноутбукам такого и не снилось, и при этом у сообщества нет идей по поводу того, как можно использовать питон на этих устройствах, — сказал он, указывая на то, что его сын использует iPad в школе. – Что будет с питоном, когда ноутбуки окажутся нишевыми устройствами?»

Кит-Мэги, чей проект BeeWare нацелен на то, чтобы единожды написанную на питоне программу можно было запускать где угодно, выкатил список проблем, которые сейчас есть у питона в области поддержки платформ, отличных от стандартных ПК x86.

Он указал на следующие недостатки: необходимость улучшения поддержки компилируемого кода для новых платформ, не совместимых с x86; набор тестов питона падает на мобильных и веб-платформах; установочный размер питон-приложений раздут и его нельзя урезать до небольшого подмножества зависимостей; необходимость потратить усилия на доработку библиотеки asyncio для работы с GUI под Android, Windows и в вебе; количество модулей в стандартной библиотеке, несовместимых с интерпретаторами питона, отличными от CPython.

Уорсо говорит, что Кит-Мэги говорит правильные вещи, и считает важным вопросы, связанные с обновлением питона для новых платформ – телефонов, планшетов, новых веб технологий типа WebAssembly.

«Пока что питон ничего хорошего предложить не может, — говорит Уорсо насчёт мечты о возможности скачать приложение для iPhone или Android, и „даже не узнать, что оно написано на питоне“.

С ростом количества ядер процессора в современных чипах (до 48 ядер в последних серверных процессорах от Intel) Уорсо также с нетерпением ждёт, когда питон лучше научится распределять задачи по нескольким ядрам.

Ему очень интересен потенциал работы Эрика Сноу над субинтерпретаторами и тем, как они могут расширить возможности питона по одновременной работе процессов. „Мне бы очень хотелось увидеть больше работы по поводу использования всех преимуществ многоядерных систем“, — говорит он.

Сноу работает над долгосрочным проектам, облегчающим питону эффективно разбивать задачи между несколькими ядрами процессора. При этом он сконцентрировался на использовании переработанной версии такой интересной возможности питона, как субинтерпретаторы и изменении того, как каждый из субинтерпретаторов взаимодействует с глобальным блокировщиком интерпретаторов (GIL).

»Для Python 3.8 он ещё не успеет подготовиться, возможно, это будет в версии 3.9, — говорит Уорсо. – Думаю, мы увидим это в ближайшие два-два с половиной года. Я настроен оптимистично. Очень рад, что Эрик продолжает работать над этим, поскольку считаю это важным».

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

Питон-сообщество также предпринимает шаги к модернизации стандартной библиотеки языка со встроенным кодом, и недавно опубликовало предложение об удалении устаревших модулей из неё; это ответ на недавнюю критику о состоянии стандартной библиотеки питона. Она обычно считается одной из сильных сторон языка, её можно использовать для решения широкого спектра обычных задач, поэтому часто говорят, что у питона «батарейки в комплекте». Однако на встрече питон-разработчиков в этом году был задан вопрос, не лучше ли позволить людям выбирать библиотеки из репозитория PyPI, вместо того, чтобы поставлять всю эту функциональность вместе с языком в качестве стандартной библиотеки.

Также были вопросы о том, не сможет ли группа лиц, руководящих разработкой языка – ключевые разработчики и управляющий совет – лучше отражать разнообразную базу пользователей питона в 2019 году. «Мне бы хотелось увидеть лучшее отображение для разнообразных метрик, не только в плане гендерного баланса, но и по расам, и по всему остальному», — говорит Виджайа.

«Я говорил на PyCon с девушками из группы PyLadies, из Индии и Африки. Они сказали: ’Когда люди слышат про питон или PyLadies, они представляют себе людей из Северной Америки или Канады, а на самом же деле в других частях света тоже имеется обширная база пользователей. Почему их видно так редко?’ И это мне кажется разумным. Поэтому я бы хотел увидеть такое, и думаю, что мы все должны принять в этом участие».

В итоге, несмотря на шутливую идею с заведующим всеми вопросами «великодушным диктатором», в последние годы все идеи, изменявшие питон, появились за счёт сообщества, говорит Уорсо, благодаря людям, использующим питон по максимуму, и открывающим двери для новых пользователей. «Реально всё происходит снизу вверх, со стороны сообщества, а не наоборот», — говорит он.

В качестве примера того, как простые проекты сообщества могут серьёзно влиять на питон, можно привести Type Hints – особенность Python 3.5, вдохновлённая проектом mypy, запущенным аспирантом в 2012 году. Эти «намёки» позволяют проводить необязательную проверку типов, что позволяет разработчикам отлавливать ошибки особого типа, которые иначе могли бы ускользнуть от них.


В этом году питон помог собрать из кусочков первое изображение чёрной дыры

Этот дополнительный уровень безопасности – не просто интересная возможность, если у вас есть проект, в котором множество людей трудится над большой базой кода. Дополнительный уровень понимания того, что код должен и не должен делать, может сыграть решающую роль.

«Тот факт, что это позволяет питону масштабироваться для нужд более крупных компаний – таких, как Instagram, который, по сути, работает на базе Python 3 – для меня просто бесценен», — говорит Уорсо, упоминающий asyncio как ещё один пример идеи, поданной сообществом, которая может серьёзно повлиять на возможности языка.

С управляющим советом и самой большой базой пользователей за всё время ван Россум оптимистично считает, что «эволюция языка благодаря сообществу» будет продолжать добиваться «невероятных успехов».

«У нас есть весьма плотное сообщество ключевых разработчиков, у которых появилась новая система правления, и я думаю, что мы лучше подготовлены к тем запросам, которые поступают к питону и его эволюции», — говорит он, нахваливая глубокое понимание конкретных аспектов языка, существующее в сообществе.

Если у кого-то есть сомнения по поводу возможности сообщества находить неожиданные новые варианты использования языка, вам достаточно будет изучить роль питона в получении первого изображения чёрной дыры, говорит Уорсо.

«Это просто снесло мне крышу. В питон-сообществе есть пара человек, которых я считаю нашими безумными учёными. Они всегда пытаются раздвинуть границы возможностей языка».

Почему существует так много Питонов? / Habr

Питон изумителен.

Удивительно, но это довольно неоднозначное заявление. Что я имею ввиду под “Питоном”? Может, абстрактный интерфейс Питона? Или CPython, распространенная реализация Питона (не путать с похожим по названию Cython)? Или я имею ввиду что-то совсем иное? Может, я косвенно ссылаюсь на Jython, или IronPython, или PyPy. Или может я отвлекся так сильно, что говорю о RPython или RubyPython (которые очень сильно отличаются).

Не смотря на схожесть в названиях указанных выше технологий, некоторые из них имеют совсем другие задачи (или, как минимум, работают совершенно иными способами)

При работе с Питоном я столкнулся с кучей таких технологий. Инструменты *ython. Но лишь недавно я уделил время, чтобы разобраться, что они собой представляют, как они работают и почему они (каждая по-своему) необходимы.

В этом посте я начну с нуля и пройдусь по разным реализациям Питона, а закончу подробным введением в PyPy, за которым, по моему мнению, будущее языка.

Все начинается с понимания того, чем на самом деле является “Питон”.

Если у вас хорошее понимание машинного кода, виртуальных машин и так далее, можете пропустить этот раздел.

Питон интерпретируемый или компилируемый?

Это распространенный источник непонимания среди новичков Питона.

Первое, что необходимо понять: “Питон” – это интерфейс. Существует спецификация, описывающая, что должен делать Питон, и как он должен себя вести (что справедливо для любого интерфейса). И существует несколько имплементаций (что также справедливо для любого интерфейса).

Второе: “интерпретируемый” и “компилируемый” это свойства имплементации, но не интерфейса.

Так что сам вопрос не совсем корректен.

В случае с самой распространенной реализацией (CPython: написанный на C, часто называемый просто “Python”, и, конечно, именно тот, который вы используете, если понятия не имеете о чем я толкую) ответ: интерпретируемый, с некоторой компиляцией. CPython компилирует* исходный код на Питоне в байткод, а затем интерпретирует этот байткод, запуская его в процессе.

* Замечание: это не совсем “компиляция” в традиционном смысле. Обычно, мы считаем, что “компиляция” это конвертация из высокоуровневого языка в машинный код. Тем не менее – в некотором роде это “компиляция”.

Давайте изучим этот ответ получше, так как он поможет нам понять некоторые концепции, ожидающие нас в этой статье.

Байткод или машинный код

Очень важно понять разницу между байткодом и машинным (или нативным) кодом. Пожалуй, легче всего ее понять на примере:

— Cи компилируется в машинный код, который впоследствии запускается напрямую процессором. Каждая инструкция заставляет процессор производить разные действия.
— Java компилируется в байткод, который впоследствии запускается на Виртуальной машине Java (Java Virtual Machine, JVM), абстрактном компьютере, который запускает программы. Каждая инструкция обрабатывается JVM, который взаимодействует с компьютером.

Сильно упрощая: машинный код намного быстрее, но байткод лучше переносим и защищен.

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

Возвращаясь к CPython, цепочка операций выглядит следующим образом:

1. CPython компилирует ваш исходный код на Питоне в байткод.
2. Этот байткод запускается на виртуальной машине CPython.

Новички зачастую допускают, что Питон компилируемый из-за наличия .pyc-файлов. Это отчасти верно: .pyc-файлы – это скомпилированный байткод, который впоследствии интерпретируется. Так что если вы запускали ваш код на Питоне, и у вас есть .pyc-файл, то во второй раз он будет работать быстрее, потому что ему не нужно будет заново компилироваться в байткод.
Альтернативные виртуальные машины: Jython, IronPython и другие

Как я говорил выше, у Питона существует несколько реализаций. Опять же, как говори-лось выше, самой популярной является CPython. Эта версия Питона написана на C и считается имплементацией “по умолчанию”.

Но как насчет альтернатив? Одна из наиболее видных это Jython, реализация Питона на Java, которая использует JVM. В то время как CPython генерирует байткод для запуска на CPython VM, Jython генерирует байткод Java для запуска на JVM (это то же самое, что генерируется при компиляции программы на Java).

“Зачем может понадобиться использовать альтернативную реализацию?”, спросите вы. Ну, для начала, разные реализации хорошо ладят с разными наборами технологий.

CPython упрощает написание C-расширений для кода на Питоне потому что в конце он запускается интерпретатором Cи. Jython в свою очередь упрощает работу с другими программами на Java: вы можете импортировать любые Java-классы без дополнительных усилий, призывая и используя ваши Java-классы из программ на Jython. (Замечание: если вы еще не думали об этом всерьез, это довольно безумно. Мы дожили до того времени, когда можно смешивать разные языки и компилировать их в одну сущность. Как заметил Rostin, программы, смешивающие код на Фортране с Cи появились довольно давно, так что это не совсем новинка. Но это все же круто.)

В качестве примера, вот корректный код на Jython:

[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51
>>> from java.util import HashSet
>>> s = HashSet(5)
>>> s.add("Foo")
>>> s.add("Bar")
>>> s
[Foo, Bar]

IronPython это другая популярная реализация Питона, написанная полностью на C# и предназначенная для .NET. В частности, она запускается на виртуальной машине .NET, если ее можно так назвать, на Common Language Runtime (CLR), от Майкрософт, сравнимым с JVM.

Можно сказать, что Jython: Java :: IronPython: C#. Они работают на соответствующих виртуальных машинах, есть возможность импортировать классы C# в код IronPython и классы Java в код Jython, и так далее.

Вполне реально выжить, не прикасаясь к ни к чему, кроме CPython. Но, переходя на другие имплементации, вы получаете преимущество, в основном из-за используемого стека технологий. Используете много языков, основанных на JVM? Jython может вам подойти. Все на .NET? Возможно, стоит попробовать IronPython (и, возможно, вы уже сделали).

Кстати, хоть это и не станет причиной для перехода на другую имплементацию, стоит упомянуть, что имплементации эти на самом деле отличаются поведением. Это касается не только способов интерпретации кода на Питоне. Однако эти отличия, как правило, не-значительны, они исчезают и появляются со временем из-за активной разработки. К примеру, IronPython использует строки Unicode по умолчанию; однако CPython использует ASCII в версиях 2.x (выдавая ошибку UnicodeEncodeError для не-ASCII символов), и при этом поддерживает символы Unicode по умолчанию в версиях 3.x.

Компиляция на лету (Just-in-Time Compilation): PyPy и будущее

Итак, у нас есть имплементация Питона, написанная на Си, еще одна – на Java, и третья на C#. Следующий логичный шаг: имплементация Питона, написанная на… Питоне. (Подготовленный читатель заметит, что это утверждение немного обманчиво).

Вот почему это может сбивать с толку. Для начала, давайте обсудим компиляцию на лету (just-in-time или JIT).

JIT. Почему и как

Напомню, что нативный машинный код намного быстрее байткода. Ну, а что, если бы можно было компилировать часть байткода и запускать его как нативный код? Пришлось бы “заплатить” некоторую цену (иными словами: время) за компиляцию байткода, но если результат будет работать быстрее, то это здорово! Этим и мотивируется JIT-компиляция, гибридная техника, которая совмещает в себе преимущества интерпретато-ров и компиляторов. В двух словах – JIT старается использовать компиляцию, чтобы ускорить систему интерпретации.

Например, вот распространенный подход JIT:

  1. Определить байткод, который запускается часто.
  2. Скомпилировать его в нативный машинный код.
  3. Закэшировать результат.
  4. Всегда когда необходимо запустить тот же самый байткод, использовать уже скомпилированный машинный код и пожинать плоды (в частности, прирост скорости).

В этом вся суть PyPy: использовать JIT в Питоне (в дополнении можно найти предыдущие попытки). Конечно, есть и другие цели: PyPy нацелен на кроссплатформенность, работу с небольшим количеством памяти и поддержку stackless (отказа от стека вызовов языка Си в пользу собственного стека). Но JIT это главное преимущество. В среднем на основе временных тестов, фактор ускорения составляет 6.27. Более подробные данные можно получить из схемы от PyPy Speed Center:

В PyPy сложно разобраться

У PyPy есть огромный потенциал, и в данный момент он хорошо совместим с CPython (так что на нем можно запускать Flask, Django, и т.д.).

Но с PyPy есть много путаницы. (оцените, к примеру, это бессмысленное предложение создать PyPyPy…). По моему мнению основная причина в том, что PyPy одновременно является:

1. Интерпретатором Питона, написанным на RPython (не Python (я обманул вас до этого)). RPython это подмножество Python со статичной типизацией. В Python, вести тщательные беседы о типах “в целом невозможно” почему это так сложно? рассмотрите следующее:

x = random.choice([1, "foo"])

это корректный код на Python (спасибо Ademan‘у). Какой тип у x? Как мы можем обсуждать типы переменных, когда типы даже не форсируются?). В RPython мы жертвуем некоторой гибкостью, но взамен получаем возможность гораздо проще управлять памятью и много чего еще, что помогает при оптимизации.

2. Компилятором, который компилирует код на RPython в разные форматы и поддерживает JIT. Платформой по-умолчанию является Си, то есть компилятор RPython-в-Си, но в качестве целевой платформы также можно выбрать JVM и другие.

Для простоты описания, я буду называть их PyPy (1) и PyPy (2).

Зачем могут понадобиться эти две вещи, и почему – в одном наборе? Думайте об этом так: PyPy (1) это интерпретатор, написанный на RPython. То есть он берет пользовательский код на Питоне и компилирует его в байткод. Но чтобы сам интерпретатор (написанный на RPython) мог работать, он должен быть интерпретирован другой реализацией Пи-тона, верно?

Итак, можно просто использовать CPython чтобы запускать интерпретатор. Но это будет не слишком быстро.

Вместо этого мы используем PyPy (2) (называемый RPython Toolchain) чтобы компилировать интерпретатор PyPy в код для другой платформы (например, C, JVM, или CLI) для запуска на конечной машине, с добавлением JIT. Это волшебно: PyPy динамически добавляет JIT к интерпретатору, генерируя собственный компилятор! (Опять же, это безумие: мы компилируем интерпретатор, добавляя другой отдельный, самостоятельный компилятор).

В конце концов результатом будет самостоятельный исполняемый файл, который интерпретирует исходный код на Питоне и использует оптимизацию JIT. То, что нужно! Понять сложновато, но, возможно, эта схема поможет:

Повторим: настоящая красота PyPy в том, что мы можем написать себе кучу разных интерпретаторов Питона на RPython не волнуясь о JIT (не считая пары деталей). После этого PyPy реализует для нас JIT, используя RPython Toolchain/PyPy (2).

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

В качестве отступления я бы хотел заметить, что сам JIT совершенно восхитителен. Он использует технику под названием “отслеживание” (tracing), которая работает следующим образом:

  1. Запустить интерпретатор и интерпретировать все (не добавляя JIT).
  2. Провести легкое профилирование интерпретированного кода.
  3. Определить операции, которые уже выполнялись ранее.
  4. Скомпилировать эти части кода в машинный код.

Узнать больше можно из этой легкодоступной и очень интересной публикации.

Подытожим: мы используем PyPy-компилятор RPython-в-Си (или другую целевую плат-форму), чтобы скомпилировать реализованный на RPython интерпретататор PyPу.

Заключение

Почему все это так восхитительно? Почему стоит гнаться за этой безумной идеей? По-моему, Алекс Гейнор объяснил это очень хорошо в своем блоге: “[За PyPy будущее] потому что [он] более быстрый, более гибкий и является лучшей платформой для развития Питона”.

Вкратце:

  • Он быстрый – потому что компилирует исходный код в нативный код (используя JIT).
  • Он гибкий – потому что добавляет JIT в интерпретатор без особых усилий.
  • Он гибкий (опять) – потому что вы можете писать интерпретаторы в RPython, что впоследствии упрощает расширение по сравнению с тем же Си (на самом деле упрощает настолько, что даже есть инструкция по написанию собственных интерпретаторов).
Дополнение: другие названия, которые вы, возможно, слышали

Python 3000 (Py3k): альтернативное название Python 3.0, основной релиз Питона с обратной совместимостью, который появился в 2008. году. Команда Py3k предсказала, что новой версии понадобится примерно пять лет чтобы полностью прижиться. И в то время, как большинство (внимание: надуманное утверждение) разработчиков на Питоне продолжают использовать Python 2.x, люди все больше задумываются о Py3k.

Cython: надмножество Python, включающее возможность вызывать функции Си.

  • Задача: позволить писать расширения Си для программ на Питоне.
  • Также позволяет добавлять статическую типизацию в существующий код на Питоне, что после повторной компиляции может помочь достичь похожей на Си производительности.
  • Напоминает PyPy, но это не то же самое. В случае с Cython вы форсируете типизацию в пользовательском коде перед подачей компилятору. В PyPy вы пишете старый добрый Python, а компилятор отвечает за любую оптимизацию.

Numba: “специализированный just-in-time компилятор”, который добавляет JIT в снабженный примечаниями код на Питоне. Проще говоря, вы даете ему подсказки, а он ускоряет некоторые части вашего кода. Numba является частью дистрибутива Anaconda набора пакетов для анализа и управления данными.

IPython: сильно отличается от всего, что мы обсудили. Вычислительная среда для Питона. Интерактивная, с поддержкой GUI-пакетов, браузеров и так далее.

Psyco: модуль расширения Питона, одна из первых попыток Питона в области JIT. Давно помечен как “неподдерживаемый и мертвый”. Главный разработчик Psyco Армин Риго сейчас работает над PyPy.

Привязки к языкам
  • RubyPython: мост между виртуальными машинами Ruby и Python. Позволяет встраивать код на Питоне в код на Ruby. Вы обозначаете, где начинается и заканчивается Питон, а RubyPython обеспечивает передачу данных между виртуальными машинами.
  • PyObjc: языковое соединение между Python и Objective-C, которые ведет себя как мост между ними. На практике это означает, что вы можете использовать библиотеки Objective-C (включая все, что нужно для создания приложения под OS X) в коде на Питоне, и модули Питона в коде на Objective-C. Это удобно, потому что CPython написан на Си, который является подмножеством Objective-C.
  • PyQt: в то время как PyObjc позволяет связать Питон с компонентами OS X GUI, PyQt делает то же для фреймворка Qt. Это дает возможность создавать полноценные графические интерфейсы, обращаться к SQL базам данных и так далее. Еще один инструмент, нацеленный на перенос простоты Питона в другие фреймворки.
JavaScript фреймворки
  • pyjs (Pyjamas): фреймворк для создания веб и десктопных приложений на Питоне. Включает в себя компилятор Python-в-JavaScript, набор виджетов и некоторые другие инструменты.
  • Brython: виртуальная машина Python, написанная на Javascript. Позволяет запустить код на Py3k в веб-браузере.

Да, Python медленный, но меня это не волнует / Habr

Разговоры о снижении производительности ради продуктивности.
Я беру паузу в моём обсуждении asyncio в Python, чтобы поговорить о скорости Python. Позвольте представиться, я — ярый поклонник Python, и использую его везде, где только удаётся. Одна из причин, почему люди выступают против этого языка, — то, что он медленный. Некоторые отказываются даже попробовать на нём поработать лишь из-за того, что «X быстрее». Вот мои мысли на этот счёт.

Производительность более не важна


Раньше программы выполнялись очень долго. Ресурсы процессора и памяти были дорогими, и время работы было важным показателем. А уж сколько платили за электричество! Однако, те времена давно прошли, потому что главное правило гласит:
Оптимизируйте использование своих самых дорогих ресурсов.
Исторически самым дорогим было процессорное время. Именно к этому подводят при изучению информатики, фокусируясь на эффективности различных алгоритмов. Увы, это уже не так — железо сейчас дёшево как никогда, а вслед за ним и время выполнения становится всё дешевле. Самым дорогим же становится время сотрудника, то есть вас. Гораздо важнее решить задачу, нежели ускорить выполнение программы. Повторюсь для тех, кто просто пролистывает статью:
Гораздо важнее решить задачу, нежели ускорить выполнение программы.

Вы можете возразить: «В моей компании заботятся о скорости. Я создаю веб-приложение, в котором все ответы приходят меньше, чем за x миллисекунд» или «от нас уходили клиенты, потому что считали наше приложение слишком медленным». Я не говорю, что скорость работы не важна совсем, я хочу лишь сказать, что она перестала быть самой важной; это уже не самый дорогой ваш ресурс.

Скорость — единственная вещь, которая имеет значение.


Когда вы употребляете слово «скорость» в контексте программирования, скорей всего вы подразумеваете производительность CPU. Но когда ваш CEO употребляет его применительно к программированию, то он подразумевает скорость бизнеса. Самая главная метрика — время выхода на рынок. В конечном счёте неважно насколько быстро работают ваши продукты, не важно на каком языке программирования они написаны или сколько требуется ресурсов для их работы. Единственная вещь, которая заставит вашу компанию выжить или умереть, — это время выхода на рынок. Я говорю больше не о том, насколько быстро идея начнёт приносить доход, а о том, как быстро вы сможете выпустить первую версию продукта. Единственный способ выжить в бизнесе — развиваться быстрее, чем конкуренты. Неважно, сколько у вас идей, если конкуренты реализуют их быстрее. Вы должны быть первыми на рынке, ну или как минимум не отставать. Чуть затормозитесь — и погибните.
Единственный способ выжить в бизнесе — развиваться быстрее, чем конкуренты.

Поговорим о микросервисах


Крупные компании, такие как Amazon, Google или Netflix, понимают важность быстрого развития. Они специально строят свой бизнес так, чтобы быстро вводить инновации. Микросервисы помогают им в этом. Эта статья не имеет никакого отношения к тому, следует ли вам строить на них свою архитектуру, но, по крайней мере, согласитесь с тем, что Amazon и Google должны их использовать. Микросервисы медленны по своей сути. Сама их концепция заключается в том, чтобы использовать сетевые вызовы. Иными словами, вместо вызова функции вы отправляетесь гулять по сети. Что может быть хуже с точки зрения производительности?! Сетевые вызовы очень медленны по сравнению с тактами процессора. Однако, большие компании по-прежнему предпочитают строить архитектуру на основе микросервисов. Я действительно не знаю, что может быть медленнее. Самый большой минус такого подхода — производительность, в то время как плюсом будет время выхода на рынок. Создавая команды вокруг небольших проектов и кодовых баз, компания может проводить итерации и вводить инновации намного быстрее. Мы видим, что даже очень крупные компании заботятся о времени выхода на рынок, а не только стартапы.

Процессор не является вашим узким местом


Если вы пишете сетевое приложение, такое как веб-сервер, скорее всего, процессор не является узким местом вашего приложения. В процессе обработки запроса будет сделано несколько сетевых обращений, например, к базе данных или кешу. Эти сервера могут быть сколь угодно быстрыми, но всё упрётся в скорость передачи данных по сети. Вот действительно классная статья, в которой сравнивается время выполнения каждой операции. В ней автор считает за один такт процессора одну секунду. В таком случае запрос из Калифорнии в Нью-Йорк растянется на 4 года. Вот такая вот сеть медленная. Для примерных расчётов предположим, что передача данных по сети внутри датацентра занимает около 3 мс, что эквивалентно 3 месяцам по нашей шкале отсчёта. Теперь возьмём программу, которая нагружает CPU. Допустим, ей надо 100 000 циклов, чтобы обработать один вызов, это будет эквивалентно 1 дню. Предположим, что мы пишем на языке, который в 5 раз медленнее — это займёт 5 дней. Для тех, кто готов ждать 3 месяца, разница в 4 дня уже не так важна.

В конечном счёте то, что python медленный, уже не имеет значения. Скорость языка (или процессорного времени) почти никогда не является проблемой. Google описал это в своём исследовании. А там, между прочим, говорится о разработке высокопроизводительной системы. В заключении приходят к следующему выводу:

Решение использовать интерпретируемый язык программирования в высокопроизводительных приложениях может быть парадоксальным, но мы столкнулись с тем, что CPU редко когда является сдерживающим фактором; выразительность языка означает, что большинство программ невелики и большую часть времени тратят на ввод-вывод, а не на собственный код. Более того, гибкость интерпретируемой реализации была полезной, как в простоте экспериментов на лингвистическом уровне, так и в предоставлении нам возможности исследовать способы распределения вычислений на многих машинах.

Другими словами:
CPU редко когда является сдерживающим фактором.

Что, если мы всё-таки упираемся в CPU?


Что насчёт таких аргументов: «Всё это прекрасно, но что, если CPU становится узким местом и это начинает сказываться на производительности?» или «Язык x менее требователен к железу, нежели y»? Они тоже имеют место быть, однако вы можете масштабировать приложение горизонтально бесконечно. Просто добавьте серверов, и сервис будет работать быстрее 🙂 Без сомнения, Python более требователен к железу, чем тот же C, но стоимость нового сервера гораздо меньше стоимости вашего времени. То есть дешевле будет докупить ресурсов, а не бросаться каждый раз что-то оптимизировать.

Так что, Python быстрый?


На протяжении всей статьи я твердил, что самое важное — время разработчика. Таким образом, остается открытым вопрос: быстрее ли Python языка X во время разработки? Смешно, но я, Google и кое-кто ещё, могут подтвердить насколько продуктивен Python. Он скрывает так много вещей от вас, помогая сосредоточиться на основной вашей задаче и не отвлекаясь на всякие мелочи. Давайте рассмотрим некоторые примеры из жизни.

По большей части все споры вокруг производительности Python скатываются к сравнению динамической и статической типизации. Думаю, все согласятся, что статически типизированные языки менее продуктивны, но на всякий случай вот хорошая статья, объясняющая почему. Что касается непосредственно Python, то есть хороший отчёт об исследовании, в котором рассматривается, сколько времени потребовалось, чтобы написать код для обработки строк на разных языках.


В представленном выше исследовании Python более чем в 2 раза продуктивнее Java. Многие другие также языки программирования дают похожий результат. Rosetta Code провёл довольно обширное исследование различий изучения языков программирования. В статье они сравнивают python с другими интерпретируемыми языками и заявляют:
Python, в целом, наиболее краток, даже в сравнении с функциональными языками (в среднем в 1,2-1,6 раза короче).

По-видимому, в реализации на Python будет как правило меньше строк кода, чем на каком-либо другом языке. Это может показаться ужасной метрикой, однако несколько исследований, в том числе и упомянутых выше, показывают, что время, затраченное на каждую строку кода, примерно одинаково на каждом языке. Таким образом, чем меньше строк кода, тем больше продуктивность. Даже сам codinghorror (программист на C#) написал статью о том, что Python более продуктивен.

Я думаю, будет справедливо сказать, что Python более продуктивен, чем многие другие языки программирования. В основном это связано с тем, что он поставляется «с батарейками», а также имеет множество сторонних библиотек на все случаи жизни. Вот небольшая статья, сравнивающая Python и X. Если вы мне не верите, можете сами убедиться насколько этот язык программирования прост и удобен. Вот ваша первая программа:

import __hello__

Но что, если скорость действительно важна?


Мои рассуждения выше могли сложить мнение, что оптимизация и скорость выполнения программы вообще не имеют значения. Во многих случаях это не так. Например, у вас есть веб-приложение и некоторый endpoint, который уж очень тормозит. У вас могут быть даже определённые требования на этот счёт. Наш пример строится на некоторых предположениях:
  1. есть некоторый endpoint, который выполняется медленно
  2. есть некоторые метрики, определяющие насколько медленными может быть обработка запросов

Мы не будем заниматься микро-оптимизацией всего приложения. Всё должно быть «достаточно быстро». Ваши пользователи могут заметить, если обработка запроса занимает секунды, но они никогда не заметят разницу между 35 мс и 25 мс. Вам нужно лишь сделать приложение «достаточно хорошим».Дисклеймер

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


Чтобы понять как оптимизировать, мы должны сначала понять что именно надо оптимизировать. В конце концов:
Любые улучшения, сделанные где-либо помимо узкого места, являются иллюзией. — Джин Ким.

Если оптимизация не устраняет узкого места приложения, то вы просто потратите впустую своё время и не решите реальную проблему. Вы не должны продолжать разработку, пока не исправите тормоза. Если вы пытаетесь оптимизировать нечто, не зная конкретно что, то вряд ли результат вас удовлетворит. Это и называется «преждевременной оптимизацией» — улучшение производительности без каких-либо метрик. Д. Кнуту часто приписывают следующую цитату, хотя он утверждает, что она не его:
Преждевременная оптимизация — корень всех зол.
Если быть точным, то более полная цитата:
Мы должны забыть об эффективности, скажем, на 97% времени: преждевременная оптимизация — корень всех зол. Однако мы не должны упускать наши возможности в этих критических 3%.

Другими словами, здесь говорится, что большую часть времени вам не нужно думать об оптимизации. Код и так хорош 🙂 А в случае, когда это не так, нужно переписать не более 3% Вас никто не похвалит, если вы сделаете обработку запроса на несколько наносекунд быстрее. Оптимизируйте то, что поддаётся измерению.

Преждевременная оптимизация, как правило, заключается в вызове более быстрых методов <прим пер. видимо, подразумеваются ассемблерные вставки> или использовании специфичных структур данных из-за их внутренней реализации. В университете нас учили, что если два алгоритма имеют одну асимптотику Big-O, то они эквивалентны. Даже если один из них в 2 раза медленнее. Компьютеры сейчас настолько быстры, что вычислительную сложность пора измерять на большом количестве данных. То есть, если у вас есть две функции O(log n), но одна в два раза медленнее другой, то это не имеет большого значения. По мере увеличения размера данных они обе начинают показывать примерно одно и то же время выполнения. Вот почему преждевременная оптимизация — это корень всего зла; Это тратит наше время и практически никогда не помогает нашей общей производительности.

В терминах Big-O все языки программирования имеют сложность O(n), где n — кол-во строк кода или инструкций. Не имеет значения, насколько медленным будет язык или его виртуальная машина — все они имеют общую асимптоту. <прим. пер. автор имеет ввиду, что даже если сейчас язык X в два раза медленнее Y, то в будущем после оптимизаций они будут примерно равны по скорости> В соответствии с этим рассуждением можно сказать, что «быстрый» язык программирования всего лишь преждевременно оптимизированный, причём непонятно по каким метрикам.

Оптимизируя Python


Что мне нравится в Python, так это то, что он позволяет оптимизировать небольшой участок кода за раз. Допустим, у вас есть метод на Python, который вы считаете своим узким местом. Вы оптимизировали его несколько раз, возможно, следуя советам отсюда и отсюда, и теперь пришли к выводу, что уже сам Python является узким местом. Но он имеет возможность вызова кода на C, а это означает, что вы можете переписать этот метод на C, чтобы уменьшить проблему с производительностью. Вы без проблем можете использовать этот метод вместе с остальным кодом.

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

Существует также язык Cython, который является надмножеством Python. Он представляет из себя смесь с типизированным C. Любой код Python является также валидным кодом и на Cython, который транслируется в C. Вы можете смешивать типы C и утиную типизацию. Используя Cython, вы получаете прирост производительности только в узком месте, не переписывая весь остальной код. Так делает, например, EVE Online. Эта MMoRPG использует только Python и Cython для всего стека, проводя оптимизацию только там, где это требуется. Кроме того, есть и другие способы. Например, PyPy — реализация JIT Python, которая может дать вам значительное ускорение во время выполнения долгоживущих приложений (например, веб-сервера), просто путем замены CPython (реализация по умолчанию) на PyPy.

Итак, основные моменты:

  • оптимизируйте использование самого дорогого ресурса — то есть вас, а не компьютера;
  • выбирайте язык/фреймворк/архитектуру, которая позволяет вам разрабатывать продукты как можно быстрее. Не стоит выбирать язык программирования лишь потому, что программы на нём работают быстро;
  • если у вас проблемы с производительностью — определите, где именно;
  • и, скорее всего, это не ресурсы процессора или Python;
  • если это всё же Python (и вы уже оптимизировали алгоритм), реализуйте проблемное место на Cython/C;
  • и побыстрее возвращайтесь к основной работе.

Спасибо за внимание!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *