Скорость обработки файлов python 3.3 по сравнению с fortran 77

странный вопрос, я знаю.

У меня есть база кода в fortran 77, которая по большей части анализирует большие недвоичные файлы, выполняет некоторые манипуляции с этими файлами, а затем делает много записи файлов. База кода не выполняет никаких манипуляций с матрицей или хруста чисел. Этот устаревший код находится в fortran, потому что многие другие базы кода требуют серьезного хруста чисел. Это было первоначально просто написано на fortran, потому что было знание Фортран.

мое предложение-переписать это полностью на python (скорее всего, 3.3). Обслуживание кода fortran так же сложно, как и ожидалось, и тесты настолько плохи, насколько вы можете себе представить. Очевидно, что python очень поможет здесь.

есть ли какие-либо хиты производительности (или даже выигрыши) с точки зрения скорости обработки файлов в python? В настоящее время большая часть времени работы этой системы находится в чтении/записи файлов.

спасибо заранее

2 ответов


части ввода-вывода стандартной библиотеки Python реализованы как эффективный код C, поэтому я видел производительность, которая лучше, чем, например, Java, особенно в случаях, когда программа связана с IO (в отличие от CPU).

Re:

В настоящее время большая часть времени работы этой системы находится в чтении/записи файлов.

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

см http://www.dabeaz.com/generators/ для действительно хорошего текста об обработке файлов в Python с помощью генераторов.

кроме того, в зависимости от характера и сложности алгоритмов обработка может оказаться, что другие абстракции (например,coroutines) или библиотеки (gevent, включает в себя и т. д.), доступных в Python поможет вам достичь более высокого уровня производительности, потому что это просто проще для понимания и рефакторинга кода. (Это, конечно,имеет место в любом сравнении языков высокого и низкого уровня.)

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

и потом на Cython что позволяет писать обычный Python, смешивая его с частями,которые будут преобразованы непосредственно в код C. Это имеет преимущество лучшей ремонтопригодности и читаемости по сравнению с Fortran (и C) с производительностью C, позволяя вам использовать большинство, если не все Python высокого уровня конструкции, а также позвонив непосредственно в чистом Python код, а также чистого кода C/библиотек (и, вероятно, Фортран код/библиотеки: http://www.sfu.ca/~mawerder/notes/calling_fortran_from_python.html). Вы также можете просто написать критическое для производительности (процессора) части вашего кода на Cython и назвать ее напрямую из Python.


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

Python не особенно плохо at IO предлагает буферизованные возможности ввода-вывода и потоковой передачи и легко расширяется с помощью C (и поэтому, вероятно, не так сложно взаимодействовать с Fortran). Python, вероятно, будет полностью разумной технологией для постепенной замены частей вашей кодовой базы-действительно, если вы можете первый make IO fast в python, вы, вероятно, можете скомпилировать расширение, которое в конечном итоге вызывает ваш код Fortran.