Сравнение решений Python и Perl для задачи Wide Finder - PullRequest
8 голосов
/ 24 сентября 2008

Я был бы очень признателен, если бы вы могли сравнить выигрышное решение Perl от O'Rourke с решение Lundh's Python , так как я недостаточно хорошо знаю Perl, чтобы понять, что происходит там. Более конкретно, я хотел бы знать, что дало Perl версии 3x преимущество: алгоритмическое превосходство, качество расширений C, другие факторы?

Wide Finder: результаты

Ответы [ 5 ]

10 голосов
/ 24 сентября 2008

Лучшая реализация регулярного выражения в perl - одна часть истории. Однако это не может объяснить, почему реализация perl лучше масштабируется. Разница становится больше с большим количеством процессоров. По какой-то причине у реализации Python есть проблема.

5 голосов
/ 24 сентября 2008

Perl сильно оптимизирован для обработки текста. Есть так много факторов, что трудно сказать, в чем именно разница. Внутренне текст представлен совершенно по-разному (utf-8 против utf-16 / utf-32), и движки регулярных выражений тоже совершенно разные. Механизм регулярных выражений в Python является нестандартным и используется не так часто, как Perl. Над этим работают очень немногие разработчики (я думаю, что он в основном не поддерживается) в отличие от Perl, который по сути является «ядром языка».

Ведь Perl - это язык обработки текста.

3 голосов
/ 09 ноября 2012

Многоядерный движок (MCE) был выпущен для Perl. MCE в этом преуспевает даже при чтении с диска с 8 рабочими (холодный кеш). Сравните с wf_mmap. При чтении входных данных MCE следует модели банковской очереди. Посмотрите в папке изображений слайды на нем.

Исходный код размещен на http://code.google.com/p/many-core-engine-perl/

Документацию по Perl можно прочитать по адресу https://metacpan.org/module/MCE

Реализация Wide Finder с MCE представлена ​​в examples / tbray /

https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/

Наслаждайтесь MCE.

Script....:  baseline1  baseline2  wf_mce1  wf_mce2  wf_mce3  wf_mmap
Cold cache:      1.674      1.370    1.252    1.182    1.174    3.056
Warm cache:      1.236      0.923    0.277    0.106    0.098    0.092
1 голос
/ 25 сентября 2008

Реализация Perl использует системный вызов mmap . То, что делает этот вызов, устанавливает указатель, который представляется процессу нормальным сегментом памяти или буфером для программы. Он отображает содержимое файла в область памяти. Существуют преимущества производительности по сравнению с обычным файловым вводом-выводом (чтение) - одно состоит в том, что нет никаких вызовов библиотеки пользовательского пространства, необходимых для получения доступа к данным, другое заключается в том, что часто требуется меньше операций копирования (например, перемещение данных между ядро и пользовательское пространство).

Строки и регулярные выражения в Perl основаны на 8-разрядных байтах (в отличие от utf16 для Java, например), поэтому собственный "тип символов" в Perl - это та же кодировка файла mmapped.

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

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

Программа Perl также поддерживает -J для распараллеливания обработки, где oepen "- |" вызывает fork (), где дескриптор файла в родительском элементе находится в stdout дочернего элемента. Дочерние процессы сериализуют свои результаты в stdout, а родительские десериализуют их, чтобы координировать и суммировать результаты.

0 голосов
/ 02 декабря 2009

Реализация Perl использует системный вызов mmap.

Это. Это позволяет избежать копирования в буфер и обеспечивает асинхронный ввод-вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...