Используйте Psyco, и Python будет работать так же быстро, как и С


Оглавление (нажмите, чтобы открыть):

Почему бы не всегда использовать psyco для кода Python?

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

Поэтому нужно удивляться. Предполагая, что вы всегда на x86-архитектуре (где большинство приложений работают в наши дни), почему бы не просто использовать psyco для всего кода Python? Иногда это делает ошибки и разрушает правильность программы? Увеличивает время выполнения для некоторых странных случаев?

Были ли у вас какие-то негативные переживания? Мой самый негативный опыт в том, что он сделал мой код быстрее всего на 15%. Обычно это лучше.

Естественно, использование psyco не является заменой эффективным алгоритмам и кодированию. Но если вы можете повысить производительность своего кода за стоимость двух строк (импорт и вызов psyco), я не вижу веских оснований не делать этого.

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

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

2) Производительность может нанести ущерб компиляции Psyco. Снова из руководства пользователя ( «известные ошибки» ):

Есть также ошибки производительности: ситуации, в которых Psyco замедляет код, а не ускоряет его. Трудно составить полный список возможных причин, но вот несколько общих:

  • Следует избегать встроенных функций map и filter и заменяться их пониманием по спискам. Например, map(lambda x: x*x, lst) следует заменить более читаемым, но более поздним синтаксисом [x*x for x in lst] .
  • Компиляция регулярных выражений, по-видимому, не принесла пользы от Psyco. (Выполнение регулярных выражений не изменяется, так как это код C.) Не включайте Psyco в этот модуль; если необходимо, отключите его явно, например. вызывая psyco.cannotcompile(re.compile) .

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

Используйте Psyco, и Python будет работать так же быстро, как и С

Python существенно изменился с тех пор, как я опубликовал свою первую версию статьи «Быстрый Python» в 1996, а значит некоторые правила могли потерять актуальность. Поэтому я перенес статью в Python wiki, в надежде, что другие помогут мне содержать ее в актуальном состоянии. Всегда проверяйте представленные здесь советы на вашем приложении и на конкретном интерпретаторе Python, который вы собираетесь использовать. Не стоит следовать этим советам вслепую, без проверки, соглашаясь, что один метод быстрее другого. В секции «профилирование» говорится об этом подробно. С тех пор, как была написана оригинальная статья, появились также следующие инструменты: Cython, Pyrex, Psyco, Weave, PyInline, PyPy, которые могут существенно повысить производительность вашего приложения, облегчая процесс преобразования критичного для производительности кода в C или в машинный код.

Предисловие: оптимизируйте то, что требует оптимизации

Не оптимизируйте программу, если производительность является достаточной.

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

Вкратце:

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

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

Сортировка

Сортировка списков базовых объектов в Python реализована эффективно. Метод sort() для сортировки списков принимает в качестве дополнительного аргумента функцию, которая может быть использована как признак, используемый во время сортировки. Это достаточно очевидно, но это также можно существенно замедлить ваши сортировки, т. к. эта функция будет вызвана несколько раз. В Python 2.4 рекомендуется использовать аргумент key для встроенной сортировки, который должен быть быстрейшим способом сортировки. Следующие руководство Гвидо ван Россума следует использовать только для более ранних версий Python (до 2.4):

Альтернативный способ ускорить сортировку — создание списка кортежей, где первый элемент — ключ для сортировки, который правильным образом отсортируется используя стандартную сортировку. Второй элемент кортежа — оригинальный список. Это так называемый Schwartzian Transform, также известный как DecorateSortUndecorate(DSU, идиома языка Perl).

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

Перезапись списка сортированным также может быть достигнута, повторяя функционал встроенной функции сортировки:

Пример использования: В Python 2.4 добавлен необязательный параметр key, который существенно упрощает нестандартную сортировку:

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

Конкатенация строк

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

В Python строки неизменяемые. Этот факт часто вызывает затруднения у новичков. Неизменность строк это одновременно некоторое количество достоинств и недостатков. К достоинствам можно отнести то, что строки могут быть использованы как значения в словарях и отдельные копии строк могут быть связаны с несколькими переменными-ссылками (Python автоматически связывает строки из 1-2 символов). К минусам можно отнести то, что вы не можете просто выполнить запрос “измени все символы ‘a’ в строке на символы ‘б’”. Вместо этого, вы должны создать новую строку с желаемыми свойствами и изменениями. Это постоянное копирование может привести к существенным задержкам в Python приложениях.

Вместо этого используйте s = «».join(list) метод. Предыдущий способ очень распространен и является катастрофической ошибкой при создании огромных строк. Также, если вы генерируете строку по кусочкам, избегайте следующего:

Используйте От переводчика:

Вместо этого используйте:

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

Последние два способа должны быть намного быстрее, особенно если через них пропускается огромное количество CGI-запусков, а также более легкими в сопровождении. К тому же, не рекомендованный медленный способ стал еще медленнее в Python 2.0 после добавления возможности перегрузить операторы сравнения. Теперь Python тратит больше времени, чтобы определить как складывать две строки (не забываем, что Python производит поиск методов прямо во время работы программы).

Примечание переводчика:

Для того, чтобы можно было сделать какие-либо выводы, привожу следующий бенчмарк (Python 3.2.3):

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

Циклы

Python поддерживает несколько циклических конструкций. Оператор for является наиболее часто используемым. Он проходит циклом по каждому элементу выражения, присваивая каждому элементу переменную цикла. Если тело вашего цикла простое, процессорное время самой функции for может составлять существенную часть общей нагрузки на проведение операции. Именно здесь может пригодиться использование функции map. Функцию map можно представить как перенесение встроенной функции for на язык C. Единственное ограничение – телом цикла должен быть вызов функции. Еще один способ — списочные выражения , они выполняется быстрее, или, как минимум, так же быстро, как цикл map. Наглядный пример. Вместо того, чтобы проходить циклом по каждому элементу списка и переводить весь текст в верхний регистр:

Можно использовать map, чтобы перенести цикл на выполнение из интерпретатора в компилированный C код:

Списочные выражения также были добавлены в Python 2.0. Они предоставляют более компактный и эффективный способ записи представленного выше примера:

Генераторы были добавлены в Python начиная с версии 2.4. Они функционируют схожим со списочными выражениями или map образом, за исключением того, что они избегают генерации всего списка сразу. Вместо этого, объект-генератор предоставляет возможность выполнять операции пошагово, друг за другом, одновременно загружая в память лишь один объект внутри списка:

Какой метод использовать зависит от используемой версии Python и манипулируемых данных. Гвидо ван Россум написал детальное руководство по оптимизации циклов, с которым обязательно стоит ознакомиться.

Избегание точек [ . ]

Допустим, вы не можете использовать функцию map или списочные выражения, вам остается использовать только for. Пример с циклом for имеет еще один недостаток. Такие операции, как newlist.append и word.upper, являются ссылками на функции, которые определяются каждый раз во время цикла. Оригинальный цикл можно заменить следующим:

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

От переводчика:
Правила избежания точек относятся и к импорту модулей. В качестве примера:

То есть лишь одно изменение правил импортирования приводит к 30% росту производительности одной итерации.

Локальные переменные

Последняя возможность ускорить цикл for — использование локальных переменных везде, где это возможно. Если наш пример перевести в функцию, append и upper становятся локальными переменными. Python работает гораздо эффективнее с локальными переменными, чем с глобальными.

На тот момент, когда я начал писать эту статью, я использовал 100MHz Pentium, на котором был запущен BSDI. Я получил следующие значения по времени исполнения при преобразовании списка слов /usr/share/dict/words (38,470 слов на то время) в верхний регистр:

Инициализация словарей

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

За исключением первого раза, каждый раз слово возвращает False проходя через оператор if. Когда вы считаете большое количество слов, скорее всего многие из них будут попадаться не один раз. В случаях, когда инициализация значения происходит лишь однажды, а основная работа идет над изменением значения, гораздо эффективнее будет использование оператора try:

Важно перехватывать только ожидаемое исключение KeyError, чтобы избежать ситуации с перехватом исключения, которое вы на самом деле не сможете обработать. Третий способ становится доступным с выпуском Python 2. Словари теперь поддерживают метод get(), который установит значение по умолчанию, если необходимый ключ не был найден в словаре. Этот способ значительно сокращает цикл:

На данный момент все три варианта решения имеют схожую производительности (с разницей не более 10%), более или менее независимо от обрабатываемых данных. Также, если значение, которое хранится в словаре, является объектом или изменяемым списком, вы также можете использовать метод dict.setdefault:

Вы можете решить, что этот способ исключает производимое дважды обращение к ключу. На самом деле это не так (даже в Python 3), но, как минимум, двойное обращение производится средствами C. Еще одно решение — использование класса defaultdict:

Перегрузки от выражений импорта

Операция импорта может быть запущена где угодно в программном коде. Часто бывает полезным размещать их внутри функций, чтобы ограничить их видимость и уменьшить начальное время запуска приложения. Хотя интерпретатор Python оптимизирован, чтобы не производить импорт одного и того же модуля несколько раз, повторный вызов функции импорта может некоторым образом отразиться на производительности. Рассмотрим следующие фрагменты кода (взятые, как мне кажется, у Greg McFarlane):

Функция doit2 будет работать значительно быстрее, чем doit1, даже не смотря на то, что doit2 обращается к модулю string глобально. Ниже представлена сессия интерпретатора Python 2.3 с модулем timeit, которая показывает, насколько второй способ быстрее первого:

Строковые методы были представлены в Python 2.0. Они представляют версию, которая совсем обходится без импортирования и работает еще быстрее:

Имейте в виду, импорт модуля внутри функции может ускорить начальную загрузку модуля, особенно если импортируемый модуль может не понадобиться. Это в общих терминах случай «ленивой» оптимизации — исключение лишней работы — импортирование тяжеловесного модуля только тогда, когда вы уверены, что он точно вам понадобится. Это является существенной оптимизацией только если модуль не будет загружен вовсе (из любого модуля) — если модуль уже был загружен (что является обычным случаем для многих стандартных модулей, таких как string или re), избегание импорта никак не оптимизирует ваш код. Чтобы узнать, какие модули загружены в систему, используйте sys.modules. Хороший способ выполнения «ленивого» импорта:

Таким способом модуль email будет импортирован лишь однажды, при первом вызове parse_email().

Агрегация данных

Затраты на вызов функции в Python относительно высоки, особенно сравнивая с запуском встроенных функций. Это позволяет сделать выводы, что функции, если это возможно, должны сами заниматься агрегацией данных. Рассмотрим пример.
Способ 1:

Рассмотрим результаты запуска:

Даже написанный на Python, второй способ работает почти в четыре раза быстрее первого. Если бы функция doit была написана на C — разница была бы еще более существенной (заменяя цикл for, написанный на python, циклом for на C, а также с устранением большинства вызовов функций).

Уменьшение частоты выполнения операций

Интерпретатор Python проводит некоторые переодические проверки. В частности, он решает, стоит ли передавать управление другому потоку, или стоит передать управление отложенному вызову (обычно это вызов, установленный обработчиком сигнала). В большинстве случаев он простаивает без работы, и вызов этих проверок каждый цикл интерпретатора может замедлять работу приложения. Существует функция в модуле sys — setcheckinterval, в которой можно указать, через какой промежуток внутренних тактов интерпретатора следует выполнять переодические проверки. По отношению к релизу до 2.3 это значение установлено как 10. В 2.3 значение было увеличено до 100. Если вы не работаете с потоками и вы не расчитываете перехватывать большое количество сигналов, установка высокого значения этого параметра может повысить производительность, иногда значительно.

Python — не C++

А также не Perl, Java, C или Haskell. Будьте аккуратны, когда переносите свои знания из других языков для решения задач в Python. Обычный пример служит отличной демонстрацией:

Теперь рассмотрим похожие программы на C (показан только пример с суммой):

Сравним время запуска:

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

Распространенный «тест», который часто проводят новые программисты на Python, переводя распространенную идиому языка Perl

В Python этот код выглядит примерно следующим образом:

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

Используйте xrange вместо range

Этот раздел не применим, если вы используете Python 3, где функция range предоставляет итератор над диапазоном заданной длины, и где функция xrange больше не существует. В ранних версиях (до Python 3) имеется два способа получить диапазон чисел: range и xrange. Большинство людей знает о range из-за его очевидного имени, в то время как xrange находится в конце алфавитного указателя и является менее известным.

Функция xrange является генератором, она в общих чертах эквивалентна следующему коду:

За исключением того, что она реализована на чистом C.

Функция xrange имеет свои ограничения. Она работает только с целыми числами. Вы не можете использовать long или float (они будут переконвертированы в int, как показано выше). Тем не менее, она сохраняет много памяти, и если вы не сохраняете генерируемый объект где-либо, то только один объект существует в один момент времени. Разница заключается в следующем: когда вы вызываете функцию range, она создает список, который хранит в себе огромное количество числовых объектов (int, float, long). Все эти объекты создаются одновременно, и все они существуют вместе в один момент времени. Это может быть проблемой, если массив чисел велик. Напротив, xrange не создает числа одновременно — только собственный объект диапазона. Числовые объекты создаются только когда вы обращаетесь к генератору, то есть проходите по нему циклом. Например:

Мастер Йода рекомендует:  AOL официально представила альтернативу Google Reader

Именно по этим причинам код выполняется моментально. Если вы запустите таким же образом range, Python заблокируется. Он будет слишком занят нахождением памяти для 9223372036854775807 (для 64-битной архитектуры) числовых объектов, чтобы делать что-либо еще. Скорее всего, процесс завершится исключением MemoryError. В версиях Python до 2.2 xrange поддерживал также быструю проверку на членство (i in xrange(n)), но эти функции были удалены из-за отсутствия применения.

Присваивание функции «на лету»

Скажем, у вас есть функция:

Скажем, эта функция вызывается откуда-то много раз.

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

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

Профилирование кода

Первым шагом в оптимизации вашей программы является нахождение ресурсоемких мест. Трудно понять смысл оптимизации кода, который никогда не был запущен, или который уже работает быстро. Я использую два модуля для нахождения ресурсоемких точек моего кода, профилирования и трассировки. В поздних примерах я использую также модуль timeit, который появился в Python 2.3. Ознакомьтесь с отдельной статьей profiling для подробностей (на англ. языке).

Профилирование

Существует несколько профилирующих модулей, включенных в стандартные «батарейки» Python. Использование любого из них для профилирования запуска некоторого набора функций достаточно просто. Допустим, ваша главная функция называется main, не требует входящих аргументов и вы хотите запустить ее под контролем профилирующих модулей. В самом простом виде вы лишь запускаете:

Когда функция выполнится, профилирующий модуль распечатает таблицу вызовов функций и времени исполнения. Вывод может быть подкорректирован используя класс Stats, который включен в поставку модуля. Начиная с Python 2.4 профилирование позволяет исследовать также время выполнения встроенных модулей и модулей расширений. Более существенное описание профилирования, используя profile и pstats, может быть найдено по следующей ссылке (на англ.).

Модули cProfile и Hotshot

Начиная с Python 2.2, пакет hotshot представляется как замена для модуля profile, хотя использование cProfile сейчас является более предпочтительным. Основополагающий модуль написан на C, поэтому использование hotshot (или cProfile) должно приводить к гораздо меньшему влиянию на производительность и давать более точную картину того, как ваше приложение работает. Существует также программа hotshotmain.py, которая упрощает запуск вашего приложения под hotshot из командной строки.

Модуль trace

Модуль trace является побочным от profile модулем, который я написал чтобы проводить некоторые низкоуровневые тесты. Он был сильно модифицирован несколькими другими людьми с тех пор, как я выпустил мой изначальный код. В Python 2.0 вы можете найти trace.py в папке Tools/scripts вашего дистрибутива Python. Начиная с версии 2.3 он входит в стандартную библиотеку (папка Lib). Вы можете скопировать его в свою локальную директорию, выставить права на запуск и запустить напрямую. Так можно получить полную трассировочную инфромацию о вашем приложении:

В Python 2.4 запустить его проще — используйте команду python -m trace. Для модуля не существует отдельной документации, но вы можете выполнить команду «pydoc trace» чтобы увидеть внутреннюю документацию.

Визуализация результатов профилирования

RunSnakeRun — GUI утилита от Mike Fletcher’a, которая визуализирует результаты cProfile используя квадратные карты. Вызовы функций и методов могут быть отсортированы по различным критериям, исходный код может отображаться рядом с визуализацией и статистикой вызовов. Пример использования:

Gpof2Dot — утилита, базирующаяся на Python, которая может преобразовывать результаты профилирования в виде графиков, которые могут быть сохранены как PNG или SVG изображения. Типичная сессия профилирования в Python 2.5 выглядит следующим образом (в более старых версиях вам понадобиться использовать сам скрипт, вместо опции -m):

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

Какая версия Python самая быстрая?

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

Является ли Python 3 медленнее Python 2? Какая версия Python 3 – самая быстрая? Какие существуют другие варианты для повышения скорости?

Использование служебной программы производительности

Главная команда Python делает многое для производительности, стоит упомянуть сайт speed.python.org, который является отличным примером с «официальными» показателями тестов CPython.

Однако существует несколько проблем:

1. Результаты достаточно сложно прочитать;

2. Они не включают в себя PyPy;

Вместо этого, вы можете скачать панель инструментов, которая запускает этот сайт при помощи команды pip install performance, после чего вы можете запустить:

Таким образом, несколько раз запустятся серии документированных «реальных» приложений с целевой версией Python с записью средних и медиан.

Это отлично подходит в контексте данной статьи для официальных инсталляций Python:

Кроме этого, это включает PyPy(5.6.) и PyPy3 (5.4.10).

Результаты

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

Я также создал простой скрипт для получения списка файлов данных производительности и создания графиков для каждого теста. Код на GitHub.

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

Полные результаты с графиками доступны здесь:

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

Рендеринг результатов в HTML

Тест django_html использует шаблон движка рендеринга Django для создания таблицы HTML 150 х 150. Он использует классы Content и Template движка Django.

Python 3.7 на 1.19x быстрее Python 2.7, но это единственный релиз Python 3.x, который опередил Python 2.7, который я запустил.

PyPy опережает все результаты CPython, однако PyPy3 в два раза медленнее PyPy. Стоит отметить недавнее решение в Django, касаемо отказа поддержки Python 2 в Django 2.0 и выше. Это означает, что PyPy больше не поддерживается Django 2.

Время запуска

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

Обратите внимание на скачок показателей PyPy, особенно PyPy3. Мы рассмотрим, почему так произошло в конце статьи.

Но суть в том, что показатель времени запуска Python 2.7 все еще самый лучший.

Криптография: crypto_paes

В данном тесте вы увидите любопытную разницу в скорости между Python 2 и 3. Почему? Crypto запрашивает большое количество расчетов, а Python 3 больше не поддерживает 32-разрядные типы чисел, только (очень) длинные числа.

Пользователи PyPy могут заметить, что PyPy3 почти в пять раз медленнее, чем PyPy!

Арифметика с плавающей точкой

«float» — это искусственное приложение арифметики с плавающей точкой, которое создаст 100 000 точечных объектов, которые вычисляют math.cos(), math.sin() и math.sqrt().

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

Регулярные выражения

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

Трудно сказать, что происходит с PyPy в данном графике. Было бы любопытно, если бы кто-нибудь прислал мне такой же результат!

Обновление: команда PyPy увидела оригинал статьи и внесла правки.

Значит, Python 3 быстрее, чем Python 2?

Именно! Практически в каждом тесте. Исключения есть только в тесте crypto_paes, где Python 3 был на 1.35 медленнее (из-за типов чисел) и в тесте python_startup медленнее на 1.39.

Медленный запуск Python 3 – это главная проблема, над которой работает основная команда CPython в версиях 3.8 и 3.9.

Помимо этих двух тестов, Python 3 в 1.2–1.3 раза быстрее по своим показателям в остальных тестах. Вы можете заметить улучшения, обновившись до Python 3.7, когда он появится на полках в этом году.

Почему PyPy такой быстрый и почему им не пользуются все?

PyPy быстрее CPython благодаря своему компилятору just-in-time. Компиляторы JIT имеют огромное преимущество, так как являются крайне эффективными при выполнении предсказуемых и повторяющихся задач. Суть наших контрольных показателей включает в себя запуск одних и тех же кусков кода несколько раз подряд для точности, ускорения приложения и снижения появлений ошибок. Здесь PyPy блистает в каждом таком тесте.

Недостаток JIT компилятора и PyPy в целом – это цена запуска. Другой недостаток – это слабая совместимость с С-расширениями. Так как Python (CPython, официальный PSF Python) написан на С, многие сторонние расширения PyPi используют этот язык. Хороший пример – Numpy, так как большая его часть написана на оптимизированном коде С. При установке numpy при помощи pip, он использует ваш локальный компилятор С и строит бинарную библиотеку для вашей среды Python для выполнения.

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

Кроме этого, PyPy переживает те же проблемы, что и CPython – переход версии языка 2 на версию 3. PyPy3 до недавних пор был достаточно нестабильным, что можно заметить по контрольным показателям, где присутствуют странные несоответствия с PyPy. Также были замечены проблемы с пакетами (PyTest), отбрасывающими поддержку PyPy3, хотя эту проблему пытаются уладить.

Подведем итоги

Python 3.7 – самая быстрая официальная версия Python, при этом PyPy демонстрирует самую быструю производительность (по крайней мере, в рамках наших тестов).

Хотелось бы в будущем увидеть производительность PyPy3 даже выше, чем это делает PyPy, так как версия Python 2 используется все реже и реже.

Python Быстродействие

Python Быстродействие, по моему мнению, вполне достаточно для решения большинства задач программирования — при недостатке быстродействия надо сменить ПК или мозги программиста.

Привожу некоторые полезные высказывания на тему Python Быстродействие:

Питон считают медленным из-за того, что он скриптовый?

Ingernirated @Ingernirated
Романыч

Никогда не задумывался, почему проскакивают такие комментарии, что Питон медленный, это потому что он интерпретируемый?
Вопрос задан 19 марта 2020 года

РЕШЕНИЯ ВОПРОСА — 4

dimonchik2013 @dimonchik2013
Выведение из запоя по фотографии

Это потому, что комментирующие не знают предмета.

Да, Питон интерпретируемый, и он медленнее компилируемого Го, и тем более С++.

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

В программировании есть два потока:
1) борьба со сложностью задачи,
2) борьба со сложностью языка,

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

Конечно, там где HighEnd — там только Си ( Го очень хорошо идёт для веба), ну так «там» и curl с nginx ом, бывает, пересобирают.

Ответ написан 19 марта

Python считается медленным, потому что он интерпретируемый и в стандартной реализации интерпретатора (CPython) нет таких вещей как JIT компиляция.

Таким образом JavaScript (на основе V8), к примеру, обгоняет его по скорости.

Кроме того, в ряде бенчмарков Python3 оказывается медленнее чем Python2.

Однако медленный — понятие относительное.

В Python сильно развита система использования внешних модулей/динамических библиотек, есть возможность писать модули на C/C++, использовать внешние динамические библиотеки с помощью ctypes и т. д.

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

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

Ответ написан 19 марта

Николай Карелин @nikolay_karelin
Системный архитектор, пишу на Python, Tcl, Matlab

Во первых, строго говоря, Python компилируется в байт-код, как и Java.

Насколько я знаю ситуацию, довольно большой вклад в медленную работу Python даёт его динамическая природа: когда виртуальная машина Python встречает выражение типа a + b, ей надо проверить, какие именно типы имеют величины из этих двух переменных, определены ли специальные методы типа __add__() и т. п. — это может занять вагон времени, особенно если происходит внутри цикла.

Хочу заметить, что доступные компиляторы для Python: PyPy (JIT), Numba (JIT, для численных расчетов), Cython (конвертер в C) основаны на выводе типов и/или специальных аннотациях, иначе большой скорости программы не будет и после них.

Я на эту тему пару докладов делал в прошлом году: https://www.youtube.com/watch?v=aVriaZJDHks (на английском) и https://dev.by/lenta/space-blog/pycon-belarus-2020 (на русском).

Ответ написан 23 марта

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

Запустите программы рисования графики, чтобы убедиться в высоком быстродействии Питона.

Привожу информацию, разъясняющую работу Интерпретатора и Компиляторов Python:

Как работает Python?

Всем ещё раз привет, сейчас расскажу о том, как работает Python, что такое Интерпретатор, как работает компилятор и что такое байт-код, далее расскажу о виртуальной машине (PVM) и о производительности Python. Также о альтернативных реализациях Интерпретатора.

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

Интерпретатор

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

В действительности Интерпретатор — это слой программной логики между Вашим программным кодом и аппаратурой Вашего компьютера.

В зависимости от используемой версии Python сам Интерпретатор может быть реализован как программа на языке C, как набор классов Java и в каком-либо другом виде, но об этом позже.

Запуск сценария в консоли

Давайте запустим в консоли интерпретатор:

Теперь он ожидает ввода команд, введите туда следующую инструкцию:

>>> print (‘hello world!’)

Ура, наша первая программа!

Запуск сценария из файла

Создайте файл «test.py», с содержимым:

# вывести «hello world»
print («hello world»)
# вывести 2 в 10 степени
print (2 ** 10)

и выполните этот файл:

Вы увидите в консоли результат, поехали дальше!

Динамическая компиляция и байт-код

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

Компиляция — это просто этап перевода, а байт-код это низкоуровневое платформо-независимое представление исходного текста программы.

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

После компиляции в байт-код, создается файл с расширением «.pyc» по соседству с исходным текстом сценария.

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

Если Python окажется не в состоянии записать файл с байт-кодом, например из-за отсутствия прав на запись на диск, то программа не пострадает, просто байт-код будет собран в памяти и при завершении программы оттуда удален.

Виртуальная машина Python (PVM)

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

Виртуальная машина — это механизм времени выполнения, она всегда присутствует в составе системы Python и это крайняя составляющая системы под названием «Интерпретатор Python».

Для закрепления пройденного ещё раз проясним ситуацию: компиляция в байт-код производится автоматически, а PVM — это всего лишь часть системы Python, которую Вы установили вместе с интерпретатором и компилятором. Всё происходит прозрачно для программиста, и Вам не надо выполнять эти операции вручную.

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

Программисты, имеющие опыт работы с такими языками как C и C++, могут заметить некоторые отличия в модели выполнения Python.

Первое — это отсутствие этапа сборки или вызова утилиты «make»: программы на Python могут быть сразу же запущены после написания исходного кода.

Мастер Йода рекомендует:  Lua — всё по этой теме для программистов

Второе отличие — байт-код не является двоичным машинным кодом (например инструкции для микропроцессора Intel), он является внутренним представлением программы на языке Python.

По этим причинам программы на Python не могут выполняться также быстро, как на C/C++.

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

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

В итоге Python по производительности находится между традиционными компилирующими и традиционными интерпретирующими языками программирования.

Альтернативные реализации Python

То, что было сказано выше о компиляторе и виртуальной машине, характерно для стандартной реализации Python, так называемой CPython (реализации на ANSI C). Однако также существует альтернативные реализации, такие как Jython и IronPython, о которых пойдёт сейчас речь.

CPython

Это стандартная и оригинальная реализация Python, названа так, потому что написана на ANSI C. Именно её мы установили, когда выбрали пакет ActivePython или установили из FreeBSD портов. Поскольку это эталонная реализация, она как правило работает быстрее, устойчивее и лучше, чем альтернативные реализации.

Jython

Первоначальное название JPython, основная цель — тесная интеграция с языком программирования Java.

Реализация Jython состоит из Java-классов, которые выполняют компиляцию программного кода на языке Python в байт-код Java и затем передают полученный байт-код виртуальной машине Java (JVM).

Цель Jython состоит в том, чтобы позволить программам на языке Python управлять Java-приложениями, точно также как CPython может управлять компонентами на языках C/C++.

Эта реализация имеет беcшовную интеграцию с Java. Поскольку программный код на Python транслируется в байт-код Java, во время выполнения он ведет себя точно также, как настоящая программа на языке Java.

Программы на Jython могут выступать в качестве апплетов и сервлетов, создавать графический интерфейс с использованием механизмов Java и т. д. Более того, Jython обеспечивает поддержку возможности импортировать и использовать Java-классы в программном коде Python.

Тем не менее, поскольку реализация Jython обеспечивает более низкую скорость выполнения и менее устойчива по сравнению с CPython, она представляет интерес скорее для разработчиков программ на языке Java, которым необходим язык сценариев в качестве интерфейса к Java-коду.

IronPython

Реализация предназначена для обеспечения интеграции программ Python с приложениями, созданными для работы в среде Microsoft .NET Framework операционной системы Windows, а также в Mono — открытом эквиваленте для Linux.

Платформа .NET и среда выполнения языка C# предназначены для обеспечения взаимодействия между программными объектами — независимо от используемого языка программирования, в духе более ранней модели COM компании Microsoft.

IronPython позволяет программам на языке Python играть роль как клиентских, так и серверных компонентов, доступных из других языков программирования .NET.

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

Средства оптимизации скорости выполнения

Существуют и другие реализации, включая динамический компилятор Psyco и транслятор Shedskin C++, которые пытаются оптимизировать основную модель выполнения.

Динамический компилятор Psyco

Система Psyco — это компонент, расширяющий модель выполнения байт-кода, что позволяет программам выполняться быстрее.

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

Для такой трансляции не требуется вносить изменения в исходный код или производить дополнительную компиляцию в ходе разработки.

Во время выполнения программы Psyco собирает информацию о типах объектов, и затем эта информация используется для генерации высокоэффективного машинного кода, оптимизированного для объектов этого типа.

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

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

Psyco обеспечивает увеличение скорости от 2 до 100 раз, но обычно в 4 раза, при использовании не модифицированного Интерпретатора Python.

Единственный минус у Psyco, это то обстоятельство, что в настоящее время он способен генерировать машинный код только для архитектуры Intel x86.

Psyco не идёт в стандартной поставке, его надо скачать и установить отдельно. Ещё есть проект PyPy, который представляет собой попытку переписать PVM с целью оптимизации кода как в Psyco, проект PyPy собирается поглотить в большей мере проект Psyco.

Транслятор Shedskin C++

Shedskin — это система, которая преобразует исходный код на языке Python в исходный код на языке C++, который затем может быть скомпилирован в машинный код. Кроме того, система реализует платформо-независимый подход к выполнению программного кода Python.

Фиксированные двоичные файлы (frozen binaries)

Иногда необходимо из своих программ на Python создавать самостоятельные исполняемые файлы. Это необходимо скорее для упаковки и распространения программ.

Фиксированные двоичные файлы объединяют в единый файл пакета байт-код программ, PVM и файлы поддержки, необходимые программам. В результате получается единственный исполняемый файл, например файл с расширение «.exe» для Windows.

На сегодняшний день существует три основных инструмента создания «frozen binaries»:

  • py2exe — он может создавать автономные программы для Windows, использующие библиотеки Tkinter, PMW, wxPython и PyGTK для создания графического интерфейса, программы использующие программные средства создания игр PyGame, клиентские программы win32com и многие другие;
  • PyInstaller — напоминает py2exe, но также работает в Linux и UNIX и способен производить само-устанавливающиеся исполняемые файлы;
  • freeze — оригинальная версия.

Вам надо загружать эти инструменты отдельно от Python, они распространяются бесплатно.

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

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

Так как Psyco обеспечивает увеличение скорости от 2 до 100 раз, считаю необходимым инсталлировать и освоить Psyco.

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

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

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Продолжение тут…

Почему бы не всегда использовать psyco для кода Python?

psyco кажется довольно полезным в оптимизации кода Python, и он делает это очень ненавязчиво.

поэтому нужно задаться вопросом. Предполагая, что вы всегда находитесь на архитектуре x86 (где в наши дни работает большинство приложений), почему бы не всегда использовать psyco для всего кода Python? Делает ли он ошибки иногда и разрушает правильность программы? Увеличивает время выполнения для некоторых странных случаев?

вы имели негативный опыт с это? Мой самый негативный опыт до сих пор заключался в том, что он сделал мой код быстрее всего на 15%. Обычно так лучше.

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

8 ответов

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

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

2) производительность может быть фактически повреждена компиляцией Psyco. Снова из руководства пользователя («известные ошибки»):

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

  • встроенный map и filter функции следует избегать и заменить понимание списка. Например, map(lambda x: x*x, lst) должен быть заменен более читаемым, но более поздним синтаксисом [x*x for x in lst] .
  • компиляция регулярных выражений, похоже, не выигрывает от Psyco. (Выполнение регулярных выражений не изменяется, так как это C-код.) Не включайте Psyco в этом модуле; при необходимости отключите его явно, например, позвонив psyco.cannotcompile(re.compile) .

3) Наконец, есть некоторые относительно неясные ситуации, когда использование Psyco на самом деле будет вводить ошибки. Некоторые из них перечисленные здесь.

Psyco в настоящее время использует много памяти. Он работает только на Intel 386-совместимые процессоры (под любой ОС) прямо сейчас. Есть некоторые тонкие семантические различия (т. е. ошибки) с образом Python работает; они не должны быть очевидно, в большинстве программ.

см. также раздел предостережения. Например, я заметил, что мое веб-приложение с шаблонами, созданными гепардом, и DB I/O не получили заметного ускорения.

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

кроме того, psyco сделал странные вещи с моими результатами профилирования (например, ну, не изменить их вообще из версии без psyco). Я подозреваю, что это не играет хорошо с кодом профилирования.

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

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

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

никогда не следует полагаться на какую-то волшебную пулю, чтобы исправить ваши проблемы. Использование psyco для ускорения медленной программы обычно не требуется. Плохие алгоритмы могут быть переписаны, и части, которые require скорость могла быть написана на другом языке. Конечно, ваш вопрос спрашивает, почему мы не используем его для повышения скорости в любом случае, и есть немного накладных расходов, когда вы используете psyco. Psyco использует память, и эти две строки просто sorta feel как накладные, когда вы смотрите на них. Как по моей личной причине, почему я не использую psyco, это потому, что он не поддерживает x86_64, который я вижу как новую архитектуру (особенно с приближением 2038 рано или поздно). Моя альтернатива-pypy, но я тоже не совсем в восторге от этого.

Python и Psyco

Вы используете Internet Explorer устаревшей и не поддерживаемой более версии. Чтобы не было проблем с отображением сайтов или форумов обновите его до версии 7.0 или более новой. Ещё лучше — поставьте браузер Opera или Mozilla Firefox.

Balancer

администратор

В начало программы вычисления чисел Фибоначи, ускоряет оную. в 30 раз

Всего в 2.5 раза медленнее чистого Си

втянувшийся

Balancer

администратор

x000> А вот интересно, есть ли что-нибудь подобное для Perl

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

x000> ибо нет времени ещё и Питон с нуля ботать

Я, вот, как раз сейчас за Питон берусь. Похоже, через 2..3 года на нём очень и очень многое работать будет.

Да и сейчас меня просто поражает количество библиотек и модулей под него.

Кроме того, весьма удобный, мощный и гармоничный язык. Да ещё и достаточно быстрый для скриптового (без psyco — этот модуль не всюду реальный прирост даёт).

x000> Хотя мне кажется, для подобных вещей вполне оправдана связка perl+forth, когда всю мутную рутину типа файлы-строки и т.д. оставляем Перлу, а Форту поручаем что-нибудь сильно греющее процессор.

Потому, ИМХО, будущее за «языковыми клеями», типа .NET. Ну и, может, Java удержится на коне и возьмёт эту область, последнее время у них тенденции на лицо. Хотя ещё и более робкие и инерционные, чем в .NET

Но вот как заменитель Перлу в консоли, заменитель древнему Бейсику на десктопе и заменитель PHP в Вебе — тут Питон очень хорошо вписывается. И это его ниша будет, думаю.

OSland

новичок

Balancer

администратор

OSland> Так уж и важно быстродействие для Питона? Что то я не слышал чтобы на нём писали расчётные задачи..

Питон сейчас первый претендент на язык всяких научных расчётов

Кроме того, сейчас Питон (области, где важно быстродействие):

— Высокопроизводительная Web-платформа
— Язык плагинов массы ресурсоёмких приложений (Blender, GIMP)
— Язык кучи популярных десктопных GUI-приложения (Gajim, куча Gnome-аплетов. )
— Скриптовый язык игровых движков (Civilization IV)

OSland

новичок

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

Вы знаете (!) есть такие специальные щипцы для обжима витой пары в ардж-45. И так же наверняка знаете что туже самую операцию можно и отвёрточкой тоненькой сделать — только вот всёж щипцами и быстрее и легче и надёжнее.. поэтому одним Питоном все «дырки» не заткнуть. Слишком он широкий уже стал. Монстр.

Balancer

администратор

OSland> Интерпретатор по определению не может быть быстрее

А в наше время разве интерпретаторы среди популярных языков ещё хоть где-то остались? Ну, кроме JavaScript на стороне клиента и /bin/bash.

OSland

новичок

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

Интерпретаторы как языки? Сейчас когда IDE-шки стали «воровать» у интерпритаторов интерактивность при разработке кода — даже сложно и ответить что есть иптерпритатор, а что компилятор..

Питон — вроде бы интерпретатор, форт (но его никто не знает)..ДжВиБайсик был такой

OSland

новичок

Balancer

администратор

OSland> Питон — вроде бы интерпретатор

Фиг знает, сколько уже времени (если не с самого начала) компилятор. При чём в наше время даже с сохранением байткода в *.pyc

> форт (но его никто не знает)

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

> ..ДжВиБайсик был такой

Ну ты вспомнил. Я даже qbasic (не путать с компилятором QB45) решил не приводить, а он помоложе будет

Как бы там ни было, сегодня практически все «скриптовые» языки — компилирующие. Просто некоторые компилируют неявно (Perl или PHP без eaccelerator) при каждом запуске, а некоторые так и вообще в «натуральном виде» — тот же Питон.

Balancer

администратор

OSland> За рисунок рядом с моим ником конечно спасибо — только убрать его можно как то?

Сменить на свой. В шапке форума в «Объявлении» см. ссылочку Что за аватары мне прописываются?

OSland

новичок

разобрался насчёт аватар и рулетки для новичков на их базе.. мнение — после урода который достался мне — сложное..

Питон компилятор? Я не так хорошо его знаю, но по моему там есть причина по которой он всё же интерпретатор — там вроде бы где-то данные можно исполнять как код в run-time?

А интерпретация форта (классического) происходит же не только при обработке входного потока. Там должен быть адресный толковщик шитого кода в момент исполнения.. Некая VM.. (про SPF не будем говорить — он «выродок» в этом смысле — хотя с какой стороны взглянуть..)

Инрепретаторы ПОТЕНЦИАЛЬНЕЕ мощнее компиляторов, дайте время — и именно они завоюют мир.

Balancer

администратор

OSland> Питон компилятор?

Именно. Ибо исполняет код программы не «с листа», а в виде байткода. Более того, в отличии от многих других аналогов в наше время имеет привычку сохранять байткод на диск в *.pyc файлах, чтобы при повторном запуске не компилировать заново

OSland> Я не так хорошо его знаю, но по моему там есть причина по которой он всё же интерпретатор — там вроде бы где-то данные можно исполнять как код в run-time?

Возможность eval не делает компилятор интерпретатором Ибо реализовать оный я могу даже на Си (прицепив в комплект к программе Си-компилятор). А в том же .NET это вообще штатная вещь.

OSland> А интерпретация форта (классического) происходит же не только при обработке входного потока. Там должен быть адресный толковщик шитого кода в момент исполнения..

Компилятор != компилятор в машинный код. Второй случай — только подмножество первого.

OSland> Некая VM..

Если рассматривать VM как интерпретатор, то в наше время всё вообще будет весело. Возьми, скажем, процессоры от Трансмета. Их внутренний машинный код не имеет ничего общего с x86. Они выполняются «в виртуальной машине на процессоре» (транслятор команд). Поэтому даже x86 ассемблер с этой твоей точки зрения на этих процессора превращается в «интерпретатор».

Мастер Йода рекомендует:  Всё про файл .htaccess

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

А вот компиляторы — они перед исполнением преобразуют во внутренний формат ВЕСЬ код программы сразу. И только потом исполнят во внутреннем формате. А уж каким методом исполнят — дело десятое.

Ещё пример. Если в программе будет синтаксическая ошибка, то интерпретатор найдёт её только попытаясь исполнить. Т.е., если блок с ошибкой синтаксиса, скажем, обходится if’ом, то программа доработает как надо. А вот компилятор найдёт ошибку сразу, до запуска. В момент компиляции.

OSland> Инрепретаторы ПОТЕНЦИАЛЬНЕЕ мощнее компиляторов, дайте время — и именно они завоюют мир.

Думается мне, время интерпретаторов уже давно прошло.

Вот время скриптовых языков — как раз сейчас пришло. Но практически все из них — компиляторы

Почему не всегда использовать Psyco для кода Python?

Психо представляется весьма полезным в оптимизации кода Python, и это делает его очень ненавязчивым способом.

Поэтому приходится удивляться. Предполагая , что вы всегда на архитектуре x86 (что, где большинство приложений работать в эти дни), то почему бы не просто всегда использовать psyco для всего кода Python? Есть ли ошибки иногда и губит правильность программы? Увеличивает время работы для некоторых странных случаев?

Были ли у вас негативный опыт с этим? Мой самый негативный опыт до сих пор было то, что он сделал мой код быстрее всего 15%. Обычно это лучше.

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

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

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

2) Производительность на самом деле может быть нанесен вред Psyco компиляции. Опять же из руководства пользователя ( «известные ошибки» раздела):

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

  • Встроенный map и filter функции следует избегать и заменены списком понимания. Например, map(lambda x: x*x, lst) должно быть заменено на более читаемым , но более поздним синтаксис [x*x for x in lst] .
  • Составление регулярных выражений , кажется, не выиграет от Psyco. (Выполнение регулярных выражений не влияет, так как код C.) Не включайте Psyco на этом модуле; в случае необходимости, отключить его явно, например, позвонив по psyco.cannotcompile(re.compile) .

3) Наконец, есть некоторые относительно неясные ситуации , в которых с помощью Psyco фактически ввести ошибки. Некоторые из них перечислены здесь .

Как быстро Python?

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

Так что я был просто интересно, если Python быстрее, чем Java или C # и как это сравнивается с C / C ++ (который я полагаю, что это будет медленнее, чем)?

С точки зрения чистой производительности, Python, безусловно , медленнее , чем Java, C # и C / C ++. Тем не менее, есть и другие вещи , которые важны для пользователя / наблюдателя , таких как общее использование памяти, начальный момент времени запуска и т.д. Для большинства вещей, Python является достаточно быстро 😉

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

Если вы заинтересованы, вы можете посмотреть на долгожданном порожнему Ласточка проект , который стремится улучшить производительность Python в пять раз выше , чем в CPython (!)

Это полностью зависит от USECASE. Для длинных запущенных приложений (например, сервера), Java, оказалось очень быстро — даже быстрее, чем С. Это возможно, поскольку виртуальная машина может скомпилировать горячую байткод в машинный код. При этом, он может в полной мере воспользоваться каждый и все функции процессора. Это, как правило, не представляется возможным для C, по крайней мере, как только вы оставите вашу лабораторную среду: только предположить, распределяя десяток оптимизировано строит для ваших клиентов — это просто не будет работать.

Но вернемся к вашему вопросу: это действительно зависит. Например, если время запуска является вопросом (который не является проблемой для серверного приложения, например) Java не может быть лучшим выбором. Она также может зависеть от того, где ваши горячие участки кода являются: Если они находятся в пределах собственных библиотек с некоторым кодом Python просто склеить их вместе, вы будете иметь возможность получить C, как производительность с Python, а также.

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

Если вы хотите скорость в Python, особенно для сложных алгоритмов, Psyco обычно помогает. С их веб — страницы:

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

2x до 100x скорости окна, как правило, 4x, с немодифицированным интерпретатором Python и немодифицированным исходным кодом, просто динамически загружаемым модулем расширения C.

Как ни странно, это не было упомянуто в приведенных выше ссылках.

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

Это очень трудно сделать действительно объективное и общее сравнение скорости выполнения двух языков. При сравнении двух любых языков X и Y, один часто находит X быстрее, чем Y, в некоторых отношениях, будучи медленнее других. Для меня, это делает какие-либо ориентиры / сравнения доступны в Интернете в основном бесполезно. Самый лучший способ, чтобы проверить это самостоятельно и посмотреть, как быстро каждый язык для работы, которую вы делаете.

Сказав, что есть определенные вещи, которые следует помнить при тестировании языков, таких как Java и Python. Код на этих языках часто может быть ускорен значительно с помощью конструкции больше подходят для языка (например, списковых в Python, или используя символ [] и StringBuilder для определенных операций строки в Java). Кроме того, для Python, используя Psyco может значительно повысить скорость работы программы. И тогда есть вся проблема использования соответствующих структур данных и следить за исполняемые сложности кода.

Я думаю, что ответ Keyle (в числе прочих) приносит домой основной момент: огромное количество зависит от того, как вы делаете вещи. Эта связь дала два ответа на C ++, но мне трудно поверить, что кто-то будет нормально писать на C ++, что это так же, как любой из них. Моя первая попытка будет выглядеть примерно так:

(Для переносимости я использовал часы () вместо gettimeofday, но любой, кто хочет может легко изменить это обратно).

Есть несколько моментов , об этом , что кажется мне интересным. Во- первых, код получил намного короче — на самом деле, конкурентоспособный как самый короткий код , показанный. Во- вторых, код получил совсем немного быстрее — вероятно , быстрее , чем что — либо , кроме специально оптимизированной версии в C ++.

Наконец, по крайней мере, мне кажется, что код получил совсем немного легче читать и понимать. На мой взгляд, его «рупор (), казалось, довольно запутанным, как это делает«лицо»на самом деле узел в связанном списке объектов Person, с обработкой цепи часть управления связного списка, но«лицо»также делает linked- список вещей, наряду с вещами «человек».

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

Используйте Psyco, и Python будет работать так же быстро, как и С

Boa Constructor • Eclipse+PyDev • Eric • Geany • IDLE • Komodo • NetBeans • PyCharm • PyScripter • SPE

Wikimedia Foundation . 2010 .

Смотреть что такое «Psyco» в других словарях:

Psyco — Saltar a navegación, búsqueda Psyco Desarrollador Armin Rigo http://psyco.sourceforge.net Información general … Wikipedia Español

Psyco — Entwickler Armin Rigo Aktuelle Version 1.6 (Dezember 2007) Betriebssystem Windows, Mac OS X, Linux, BSD Derivate. Kategorie JIT Compiler … Deutsch Wikipedia

Psyco — Infobox Software name = Psyco caption = developer = Armin Rigo latest release version = 1.6 latest release date = December 16, 2007 operating system = Cross platform genre = just in time compiler for Python license = MIT License website =… … Wikipedia

Psyco Gundam — (Japanese: サイコガンダム, Saikogandamu , PSYCO GUNDAM ) refers to a series of fictional mobile armours of prodigious size, appearing in the Gundam franchise in various forms. The animation incarnations were designed by Kazumi Fujita (original work by… … Wikipedia

M. Bison — (Vega en Japón) es el villano más recurrente de la saga de v >Wikipedia Español

SD Gundam Force Emaki Musharetsuden — Infobox animanga/Header name = SD Gundam Force Emaki Musharetsuden caption = Cover of final manga volume ja name = SDガンダムフォース絵巻 武者烈伝 武化舞可編 ja name trans = genre = Infobox animanga/Manga title = author = Masato Ichishiki publisher = Kodansha… … Wikipedia

List of Mobile Suit Zeta Gundam characters — Mobile Suit Zeta Gundam is a Japanese science fiction anime television series that originally aired on Nagoya Broadcasting Network between March 2, 1985 and February 22, 1986. Mobile Suit Zeta Gundam featured many new characters and several… … Wikipedia

Four Murasame — Infobox animanga character name = Four Murasame series = Mobile Suit Gundam caption = Four Murasame in the Mobile Suit Gundam: Climax U.C. PS2 game first = Episode 17, Hong Kong City last = Episode 50, R >Wikipedia

List of mobile weapons — This is a list of mobile suits, mobile pods, mobile armors, mobile dolls, and mobile fighters from the highly popular mecha anime Gundam . The general term for a group of the different types and styles of mobile units is known as mobile weapons.… … Wikipedia

Python — У этого термина существуют и другие значения, см. Python (значения). Python Класс языка: му … Википедия

Как быстро Python?

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

Так что я был просто интересно, если Python быстрее, чем Java или C # и как это сравнивается с C / C ++ (который я полагаю, что это будет медленнее, чем)?

С точки зрения чистой производительности, Python, безусловно , медленнее , чем Java, C # и C / C ++. Тем не менее, есть и другие вещи , которые важны для пользователя / наблюдателя , таких как общее использование памяти, начальный момент времени запуска и т.д. Для большинства вещей, Python является достаточно быстро 😉

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

Если вы заинтересованы, вы можете посмотреть на долгожданном порожнему Ласточка проект , который стремится улучшить производительность Python в пять раз выше , чем в CPython (!)

Это полностью зависит от USECASE. Для длинных запущенных приложений (например, сервера), Java, оказалось очень быстро — даже быстрее, чем С. Это возможно, поскольку виртуальная машина может скомпилировать горячую байткод в машинный код. При этом, он может в полной мере воспользоваться каждый и все функции процессора. Это, как правило, не представляется возможным для C, по крайней мере, как только вы оставите вашу лабораторную среду: только предположить, распределяя десяток оптимизировано строит для ваших клиентов — это просто не будет работать.

Но вернемся к вашему вопросу: это действительно зависит. Например, если время запуска является вопросом (который не является проблемой для серверного приложения, например) Java не может быть лучшим выбором. Она также может зависеть от того, где ваши горячие участки кода являются: Если они находятся в пределах собственных библиотек с некоторым кодом Python просто склеить их вместе, вы будете иметь возможность получить C, как производительность с Python, а также.

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

Если вы хотите скорость в Python, особенно для сложных алгоритмов, Psyco обычно помогает. С их веб — страницы:

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

2x до 100x скорости окна, как правило, 4x, с немодифицированным интерпретатором Python и немодифицированным исходным кодом, просто динамически загружаемым модулем расширения C.

Как ни странно, это не было упомянуто в приведенных выше ссылках.

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

Это очень трудно сделать действительно объективное и общее сравнение скорости выполнения двух языков. При сравнении двух любых языков X и Y, один часто находит X быстрее, чем Y, в некоторых отношениях, будучи медленнее других. Для меня, это делает какие-либо ориентиры / сравнения доступны в Интернете в основном бесполезно. Самый лучший способ, чтобы проверить это самостоятельно и посмотреть, как быстро каждый язык для работы, которую вы делаете.

Сказав, что есть определенные вещи, которые следует помнить при тестировании языков, таких как Java и Python. Код на этих языках часто может быть ускорен значительно с помощью конструкции больше подходят для языка (например, списковых в Python, или используя символ [] и StringBuilder для определенных операций строки в Java). Кроме того, для Python, используя Psyco может значительно повысить скорость работы программы. И тогда есть вся проблема использования соответствующих структур данных и следить за исполняемые сложности кода.

Я думаю, что ответ Keyle (в числе прочих) приносит домой основной момент: огромное количество зависит от того, как вы делаете вещи. Эта связь дала два ответа на C ++, но мне трудно поверить, что кто-то будет нормально писать на C ++, что это так же, как любой из них. Моя первая попытка будет выглядеть примерно так:

(Для переносимости я использовал часы () вместо gettimeofday, но любой, кто хочет может легко изменить это обратно).

Есть несколько моментов , об этом , что кажется мне интересным. Во- первых, код получил намного короче — на самом деле, конкурентоспособный как самый короткий код , показанный. Во- вторых, код получил совсем немного быстрее — вероятно , быстрее , чем что — либо , кроме специально оптимизированной версии в C ++.

Наконец, по крайней мере, мне кажется, что код получил совсем немного легче читать и понимать. На мой взгляд, его «рупор (), казалось, довольно запутанным, как это делает«лицо»на самом деле узел в связанном списке объектов Person, с обработкой цепи часть управления связного списка, но«лицо»также делает linked- список вещей, наряду с вещами «человек».

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

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