Почему моя версия 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 в диапазоне ()».

  • Изменить регистр первой буквы в каждой ячейке таблицы
  • Как извлечь последовательности символов Unicode из исполняемого файла MZ?
  • Почему я не могу получить синтаксические ошибки при выполнении моего скрипта Python с Perl?
  • Программно извлекать данные из электронной таблицы Excel
  • Каковы различия между Perl, Python, AWK и sed?
  • Преобразование в и из индуистского календаря
  • Сравнение скорости несогласованного регулярного выражения
  • Неблокирующий джанго?
  •  
    Interesting Posts for Van-Lav

    Что происходит с этим синтаксисом python? (c == c in s)

    Numpy int array: поиск индексов нескольких целевых ints

    Python: как обращаться к имени экземпляра?

    удалить pytz часовой пояс

    Почему функции в Python могут печатать переменные в приложении, но не могут использовать их при назначении?

    Использование boto для AWS S3 Ковши для подписи V4

    Сделать Python прекратить испускать возврат каретки при написании новых строк в sys.stdout

    Работники пула не выполняют все задачи

    Извлечение XML в фрейм данных с родительским атрибутом в качестве заголовка столбца

    Убедитесь, что все значения итерации равны нулю

    Как показать непрерывные обновления в реальном времени, такие как facebook ticker, домашняя страница meetup.com?

    Вызов переопределенного метода, суперкласс переадресовывает вызовы

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

    Scrapy – Как извлечь все сообщения в блоге из категории?

    Общая строка данных панд

    Python - лучший язык программирования в мире.