Почему моя версия Python медленнее, чем моя версия Perl?

Я был парком Perl более 10 лет, но друг убедил меня попробовать Python и рассказал мне, насколько он быстрее, чем Perl. Так что для пинков я портировал приложение, написанное в Perl на Python, и обнаружил, что он работает примерно на 3 раза медленнее. Первоначально мой друг сказал мне, что я, должно быть, сделал это неправильно, поэтому я переписал и реорганизовал, пока не смог переписать и не рефакторировать больше, и … это все еще намного медленнее. Поэтому я сделал простой тест:

i = 0 j = 0 while (i < 100000000): i = i + 1 j = j + 1 print j 

$ time python python.py
100000000

реальный 0m48.100s
пользователь 0m45.633s
sys 0m0.043s

 my $i = 0; my $j = 0; while ($i < 100000000) { ++$i; # also tested $i = $i + 1 to be fair, same result ++$j; } print $j; 

$ time perl perl.pl
100000000

реальный 0m24.757s
пользователь 0m22.341s
sys 0m0.029s

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

3 Solutions collect form web for “Почему моя версия Python медленнее, чем моя версия Perl?”

Ответ на выбор – это то, что вы должны сравнить его с идиоматическим Python:

  • Исходный код занимает 34 секунды на моей машине.
  • Цикл for ( ответ FlorianH ) с += и xrange() принимает 21 .
  • Включение всего объекта в функцию уменьшает его до 9 секунд!
    Это намного быстрее, чем Perl (15 секунд на моей машине)!
    Объяснение: Локальные локали Python намного быстрее, чем глобальные .
    (Для справедливости я также пробовал функцию в Perl – без изменений)
  • Избавление от переменной j уменьшило ее до 8 секунд:

    print sum(1 for i in xrange(100000000))

У Python есть странное свойство, что более быстрый код более высокого уровня имеет тенденцию быть самым быстрым 🙂

Но реальный ответ заключается в том, что ваш «микро-бенчмарк» не имеет смысла. Реальный вопрос о скорости языка: какова производительность среднего реального приложения? Чтобы это знать, вы должны учитывать:

  • Типичное сочетание операций в сложном коде. Ваш код не содержит никаких структур данных, вызовов функций или операций ООП.

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

  • Возможности оптимизации : после того, как вы напишете свой код, ЕСЛИ это не достаточно быстро, насколько быстрее вы можете легко это сделать?

    Например, как трудно разгрузить тяжелый подъем до эффективных либрав C?

Ориентиры PyPy и Octane – хорошие примеры того, как выглядят реалистичные языковые тесты.

Если вы хотите поговорить о количестве хрустов, Python IS на удивление популярен среди ученых. Они любят его для простого псевдоматного синтаксиса и короткой кривой обучения, но также для отличной библиотеки numpy для хруста массива и простоты обертывания другого существующего кода C.

И тогда есть Psyco JIT, который, вероятно, запустит ваш игрушечный пример за 1 секунду, но я не могу проверить его сейчас, потому что он работает только на 32-битной x86.
EDIT : В настоящее время, пропустите Psyco и используйте PyPy, который кросс-платформу активно улучшает JIT.

Все это микро-бенчмаркинг может стать немного глупым!

Напр. просто переход for в Python и Perl обеспечивает высокую скорость. Первоначальный пример Perl был бы в два раза быстрее, если бы использовался:

 my $j = 0; for my $i (1..100000000) { ++$j; } print $j; 

И я могу немного сбрить с этим:

 ++$j for 1..100000000; print $j; 

И, становясь еще глуже, мы можем получить его до 1 секунды здесь 😉

 print {STDOUT} (1..10000000)[-1]; 

/ I3az /

ref : используется Perl 5.10.1.

Python работает очень быстро, если вы используете правильный синтаксис языка python. Он примерно описывается как « пифонический ».

Если вы измените свой код таким образом, он будет работать как минимум в два раза быстрее (ну, это на моей машине):

 j = 0 for i in range(10000000): j = j + 1 print j 

Всякий раз, когда вы используете некоторое время на python, вы должны проверить, можете ли вы также использовать «для X в диапазоне ()».

  • Нужно пинговать 1000 URL-адресов каждые 2 минуты
  • Как я могу получить часть регулярного выражения как переменную в python?
  • Числовой вывод и не повторяют повторяющиеся числа для ex 1010101; 2020202, 1212121
  • Perl для переводчика кода Python / Ruby
  • Как вы переводите эту идиому регулярного выражения из Perl в Python?
  • Существует ли необходимость в использовании «строгого» компилятора Python?
  • Perl эквивалент интерпретаций списка Python со встроенным if-выражением?
  • Анализ худших случаев для регулярных выражений
  • Изучение Perl с точки зрения Python
  • Выбор языка сценариев для начальной работы
  • Как я могу получить снимок экрана нескольких веб-сайтов?
  • Python - лучший язык программирования в мире.