Py4science

From Wikimization

Revision as of 00:51, 11 February 2009 by 193.239.178.220 (Talk)
Jump to: navigation, search
Использование языка Python для разработки научно-технического программного обеспечения


Предисловие.
В этой статье мы рассмотрим преимущества и недостатки использования языка Python в научно-инженерных приложениях как альтернативы традиционным C, C++, Fortran и, прежде всего, MATLAB, Octave и другим математическим пакетам. Она написана по мотивам одноименного семинара, прошедшего 2009-02-05 в институте кибернетики НАНУ. Там я допустил ряд оговорок, которые и собираюсь исправить в этой статье (перед докладом присутствующие попросили сократить его с предложенных мне начальством и планировавшихся 40-60 минут до 30, что сказалось на качестве, к тому же, наверное, повлияло то, что с самого утра и до доклада в 15-00 я так и не успел ничего поесть:) ). pdf-файл с тезисами упомянутого семинара можно скачать здесь.
Статья написана по просьбе developers.org.ua и, соответственно, выдержана в стиле других статей с этого сайта.


Мотивация.
Почему вообще стоит тратить время на изучение Python (и, более того, писать на нем научное ПО), когда и так есть С/C++, Fortran, MATLAB/Octave, с достаточным количеством соответствующего ПО, более того, обычно бесплатного?

Прежде всего, низкоуровневые языки, такие как С, C++, Fortran, Assembler, не позволяют RAD (Rapid Application Development - быстрая разработка приложений). Приходится тратить много времени на компиляцию и линкование, а пользоваться отладчиком многие не умеют (особенно школьники и студенты). Кроме того, и С, и Fortran являются "Write Only Language" (особенно это актуально для Perl, где написанный код понимает только его автор, и то как правило не дольше 10 минут). Как правило, часто требуется также синхронизация (автоматическая или ручная) header-ов (h, hpp и тп) и source-файлов (с, cpp и тп). Очень часто встречаются runtime-ошибки "выход за границу массива", которые неопытным пользователям тяжело как находить, так и не допускать. На сайте mloss.org, где из уже более 170 пакетов относительно нового найчно-технического направления (machine learning), нет ни одного (!) пакета, написанного на Fortran. Также, низкоуровневые языки не являются кросс-платформенными.

Одной из составляющих RAD-свойств Python является отсутствие строгой типизации. Посмотрим например на следующую функцию:

def myFunc(a, b):

return 2*a + b

Здесь нам не требуется указывать типы аргументов a и b, это может быть все, что только позволяет делать операции суммы и умножения на 2 без ошибок: это могут быть числа, число и матрица из numpy, строки, списки, матрицы одинаковой размерности, объекты какого-либо класса пользователя, с учетом того, что он определил операции сложения и умножения на число.


Выучить Python несложно даже школьнику за пару недель, чего нельзя сказать про C/С++, Fortran, Ocaml, Erlang. По оценкам специалистов, разработка приложений на Python примерно в 2 раза быстрее, чем на Fortran, кроме того, написанные программы содержат намного меньше строк кода и более читабельные, что позволяет легче вносить изменения. А ведь это не только зарплаты программистов, но и аренда помещений, зарплата другим сотрудникам организаций, да и просто опережение конкурентов и своевременное выполнение сроков. Опыт моей работы в коммерческих фирмах свидетельствует, что очень часто между софтверной организацией и потенциальным заказчиком проходит следующий диалог: “Ваше ПО считает задачу за 30 секунд. За 5000$ мы можем написать ПО, которое будет считать ее за 3 секунды.” - “А нам не надо считать ее за 3 секунды, мы считаем ее раз в неделю, а через месяц мы купим новый процессор за 500$ и будем считать ее за 15 сек.”

Рассмотрим теперь высокоуровневые языки. MATLAB, MAPLE, MATCAD, Mathematica довольно дорогие. Конечно, сейчас у нас нетрудно приобрести нелицензионную версию, но:

  • это не гарантирует, что такая ситуация будет продолжаться всегда
  • кроме приличной цены, требуется еще и платить ~10% в год за обновления библиотек
  • за границей (Китай, Бразилия и тп, особенно Европа, в которой более строго с нелицензионным ПО), где осознали всю негативную сторону зависимости от коммерческого ПО, начинается мощное движение о переходе на свободное ПО в образовании, муниципальных и других государственных структурах. Со временем это приведет к улучению качества СПО, так что миграция и программистов, и заказчиков, и пользователей только ускорится. Поэтому сделавшие ставку на эти коммерческое пакеты в будущем могут об этом пожалеть, т.к. качественно переписать тысячи строк кода, особенно если организация не распологает квалифицированными в обоих языках специалистами - задача непростая и технически, и финансово.

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

  • очень высокая цена (на сегодняшний день для фирмы, без скидок – 3000$ за MATLAB + цены за тулбоксы, например Optimization toolbox – 1562$, по прайс-листу softline.ru).
  • необходимость заканчивать каждую строку кода символом “;”
  • отсутствие компилятора в машинный код
  • неудобная стыковка с другими языками программирования (С, Fortran) посредством mex- функций.
  • неудобная обработка строк и других типов, в том числе классов ООП
  • передача аргументов копированием.

Как очень точно было отмечено в одном из сообщений MATLAB mail-list, Octave, SciLab и т.п. - это посредственная имплементация языка MATLAB, который, в свою очередь, посредственная реализация всего, кроме матриц. Однако следует отметить, что за последние 2 года некоторый прогресс, особенно в ООП, в MATLABе был достигнут.

Что касается Octave и особенно SciLab, стоит также упомянуть проблемы с лицензией. Для Octave это GPL, содержащая copyleft (который запрещает использовать в лицензии своего продукта более сильные ограничения, чем ограничения используемых в нем библиотек с copyleft), для SciLab она вообще не является OSI-approved. Это очень сильно сдерживает их распространение и развитие, т.к. ряд организаций, выпускающих коммерческое ПО, не использует их, предпочитая продукты без copyleft (т.е. c такими лицензиями как BSD, MIT, Apache).

Вообще, по наблюдениям автора, общая тенденция в развитии программного обеспечения (в т.ч. научного) такая: свободное ПО постепенно вытесняет коммерческое, тогда как свободное ПО без copyleft постепенно вытесняет содержащее copyleft (за счет того, что более охотно получает финансовую поддержку от софтверных организаций). Типичный пример – широко библиотеки BLAS и LAPACK. Для ряда другого, более сложного научного ПО, например численная оптимизация, коммерческое ПО пока еще сохраняет свои позиции, но все же на мой взгляд это только вопрос времени - уже сейчас такие бесплатные решатели как IPOPT или DSDP показывают результаты на уровне коммерческого ПО стоимостью в тысячи долларов. Стоит отметить, что основной финансовой основой для развития научного СПО являются гранты от научных фондов, университетов, ряда организаций (IBM, Sun Microsystems и т.п.).

Что касается использования других высокоуровневых языков в научно-технических целях, то недостатки у них следующие:

  • OCAML – лицензия (GPL), сложность изучения
  • Ruby – низкая скорость (в 2-4 раза меньше Python), популярность в основном благодаря ROR (беблиотека для разработки web-приложений), отсутствие множественного наследования, неопределенность в выборе наиболее быстрого подхода к написанию участков кода.
  • Java – этот язык более низкого уровня чем Python, Ruby, MATLAB, поэтому разработка приложений занимает больше времени.
  • Groovy, Cobra (не путать с CORBA) и другие клоны Python - в первую очередь небольшое кол-во написанного для них ПО. Не так уж сложно взять за основу какой-нибуть из существующих языков и исправить несколько его недостатков, но, как особенно любят говорить Java-программисты, язык без батареек сейчас никому не нужен. Кстати, одним из слоганов Python как раз и является “Batteries included” - т.е. к языку прилагается множество программных модулей.
  • F# - уже сам факт того, что за ним стоит Microsoft, отпугивает многих пользователей (и, следовательно, уменьшает аудиторию и распространение языка). В половине F# FAQ автор неубедительно пытается откреститься от Microsoft и возможных лицензионных проблем. Кроме того, на мой взгляд, F# не полностью избавился от недостатков OCAML.
  • R – лицензия (GPL), узкая основная направленность (стохастическая), не очень удобный синтаксис.
  • Что же касается Pascal, по мнению автора, в школах и некоторых ВУЗах Украины его учат просто по инерции, никаких особых достоинств по сравнению с конкурентами у него давно уже нет.

Кроме того, почти все упомянутые здесь языки (кроме разве что R), так же как и PHP, tcl (в которых к тому же приходится писать надоедливый знак "$", а в случае PHP - еще и ";"), имеют очень небольшое кол-во научного ПО (по сравнению с Python, включая ПО с Python-интерфейсами).

Как и любой другой язык программирования, Python имеет свои недостатки:

  • Python изначально не предназначался для научно-технических задач, впрочем как и С/С++. Поэтому его программные конструкции в этом плане оставляют желать лучшего, так же как и скорость (что частично компенсируется numpy и удобством подключения кода других языков, см ниже).
  • В отличие от MATLAB, Octave и ряда другого ПО, в Python нет стандартной библиотеки для разреженных матриц: кто-то пользуется scipy.sparse, кто-то PySparse, кто-то (как CVXOPT) использует свои библиотеки и/или BLAS, кто-то просто 3 столбца (координаты числа и его значение). По мнению автора, отказ разработчиков scipy включить разряженные библиотеки (их автору) в numpy был большой ошибкой, иначе сейчас это уже было бы единым стандартом.
  • В настоящее время Python проходит болезненную миграцию с версии 2.5 до 2.6 и далее 3.0, где очень много изменений. Есть программы, которые позволяют делать это автоматически, но на numpy и scipy, которые имеют значительную часть кода C и Fortran, это не распространяется. Подробнее см здесь. По-видимому, именно с этим связано локальное снижение популярности Python в TIOBE index.
  • Выделение блоков основано на индентации. Некоторые пользователи (в т.ч. я) это любят, остальные – наоборот, терпеть не могут.

Основные дистрибутивы Python.

  • CPython – основная имплементация Python на языке С, выполненная автором Python Guido van Rossum. Он занимает более 90% от всех имплементаций.
  • Jython – имплементация Python на Java. Изначально на нее полагались большие ожидания, но ничего особенного она так и не показала, во многом из-за не очень большой скорости и несовместимостью со многими библиотеками, написанными под CPython.
  • IronPython – имплементация Python под Microsoft .NET. Имеет свой контингент пользователей, но в первую очередь Microsoft занята продвижением конкурирующегос Python языка С#.
  • PyPy (PythonPython) – эксперементальная имплементация, выполнявшаяся несколько лет коллективом, спонсированным одним из грантов FP7. Вряд ли у него есть будущее (из-за несовместимости с библиотеками CPython), но его наработки (динамическая трансляция некоторых участков кода в С и их компиляция “на лету”) возможно, в будущем будут использованы в CPython.
  • PyMite – имплементация Python для ряда микропроцессоров (в первую очередь Atmel).


Основные научные библиотеки Python.
Прежде всего, следует отметить numpy (numeric python, numpy.scipy.org) и scipy (scientific python, scipy.org), см также их страницы на wikipedia.org : NumPy, SciPy. Они (и их списки почтовых рассылок – numpy-user, scipy-user, scipy-dev, см http://scipy.org/Mailing_Lists) являются “точками сбора” всех пользователей Python в научно-технических целях (впрочем, стоит отметить также SAGE google groups).

  • NumPy – это низкоуровневая библиотека, написанная в основном на С и Фортран (в основном матричные операции), опирается на код BLAS+ATLAS, LAPACK. См также “NumPy для пользователей MATLAB”: http://www.scipy.org/NumPy_for_Matlab_Users. Тем, у кого проблемы с английским, могу порекомендовать вставить этот html-адрес в translate.google.com или аналогичный сервис.
  • SciPy – численное интегрирование, сплайны, оптимизация, решения систем диф. уравнений и т.п. Впрочем, иногда отдельные специализированные пакеты обладают бОльшим удобством, функциональностью и т.п (например, OpenOpt vs scipy.optimize).
  • В качестве аналога MATLAB plot tool наиболее распространен matplotlib.

Рекомендуется посмотреть на следующие списки научного ПО для Python:

А также на голосование об использовании научных пакетов


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

  • EPD (Enthought Python Distribution) – содержит numpy, scipy, matplotlib и многое другое, установка – практически в несколько кликов мышью. Недостатки: лицензия – free for non-commercial; платформы – только коммерческие Windows и RHEL, а прилагаемые к EPD IDE (IDLE и Scite) по функциональности могут конкурировать разве что с Microsoft notepad. Enthought является спонсором numpy/scipy.
  • SAGE – "свободная конкурентноспособная альтернатива MATLAB, MAPLE, MATCAD, Mathematica". В принципе, он соответствует этой характеристике, однако пользоваться им я бы не рекомендовал, в т.ч. даже в образовательных целях. Во-первых, для Windows требуется устанавливать VMWare. Во-вторых, сам SAGE занимает ~800 MB, компиляция занимает несколько часов. Средой разработки обычно выступает Mozilla Firefox с минимумом функциональности, рекомендуется разве что фанатам MATLAB Cells. Из плюсов следует отметить встроенные удобные интерфейсы к MATLAB, Octave, R и т.п.
  • PythonXY – дистрибутив, основанный на Eclipse (широкораспространенная бесплатная кроссплатформенная IDE, имеет плагины к Python). Дополнительные модули можно устанавливать как exe-файлы (также PythonXY доступен для Debian-based ОС Linux).

Воспользоваться хотя бы одним из этих дистрибутивов стоит уже хотя бы для того, чтобы избежать потенциальных проблем при установке numpy, scipy, matplotlib и т.п. (особенно это актуально, если нельзя воспользоваться apt-get, yum и другими утилитами для автоматического скачивания и установки в Linux). После этого можно установить предпочитаемое Python IDE (если содержащиеся в дистрибутиве по каким-то причинам не устраивают).


Основные среды разработки для Python.
Прежде всего я рекомендовал бы обратить внимание на Eric, NetBeans, Eclipse, SPE.

Из извесных мне IDE только Eric имеет Python Command Shell, аналогичную MATLAB Command Shell, поэтому именно его я бы рекомендовал в первую очередь (коммерческая Wing IDE имеет сразу 2 окна, из них одно для отладчика, по моему опыту это неудобно). Стоит отметить, что единственному разработчику Eric (Detlev Offenbach) удается поддерживать его функциональность и (немецкое) качество на уровне NetBeans, Eclipse (которые пишутся командами разработчиков при большой финансовой поддержке ряда корпораций), так же как и коммерческих KOMODO, Wing IDE. Кроме того, он потребляет всего 41 МБ RAM (Eclipse – 137, NetBeans 6.1/6.5 – 229/412). Время загрузки, сек – 4 – 21 – 16/25. Данные приведены для AMD Athlon 3800+ X2, Linux KUBUNTU. Один из доступных плагинов Eric проводит русификацию этого IDE.

Недостатком Eric являются проблемы с установкой, особенно с его зависимостями (лучше всего через apt-get, yum и другие Linux update channels установить все зависимости, а потом поставить сверху последнюю версию Eric, на вопрос о Qt data directory обычно помогает просто Enter. Если вместе с зависимостями вы установили и сам Eric, проверьте, какую версию вы запускаете (Help->About Eric) и в случае старой версии измените путь на новую). Очень рекомендуется устанавливать версию не старее 4.3.0 (2009-02-08), т.к. там наконец-то были исправлены пара недостатков (по просьбе автора статьи) – прокрутка файловых вкладок доступна мышью, окно отладчика сразу переключается в locals; еще один недостаток- отсутствие возможности выполнения команд из текущей функции стека – Detlev пообещал исправить в 4.4.0, как и добавление визуальной системы ошибок и предупреждений, аналогичной MATLAB и NetBeans. Установка плагинов в Eric не очень удобна: Plugins->Plugin Repository->update;download;install; Plugins->Plugin Infos->activate, autoactivate. Прежде всего стоит установить pylint. Это менее удобно, чем в NetBeans, но более удобно чем в Eclipse, где к тому же установка плагинов почему-то выполняется через меню Help.

После установки Eric рекомендуется сразу же произвести начальную настройку - удалить подсветку текущего слова (если это еще не убрано в новой версии) и изменить цвет для подсветки результатов поиска с красного на какой-то получше, выставить типы файлов по умолчанию для сохранить/загрузить "py" (Python), удалить или переставить окно project-viewer, чтобы оно не мельтешило при включении/отключении отладчика.

Все 3 рассмотренные среды разработки имеют conditional breakpoints, интеграцию с версионными системами (cvs, svn и тд) и практически полный спектр стандартных услуг. Полный список Python IDEs здесь.


Использование кода других языков в Python.
Для подключения кода других языков в первую очередь рекомендуется:

  • Fortran – f2py (включен в numpy)
  • C/C++ - Python C API, SWIG, Pyrex, ctypes, cython. Последние два включены в numpy. Прежде всего стоит испольовать cython (Pyrex – его предшественник).
  • R – RPy
  • MATLAB – Mlabwrap. См также дискуссию об автоматической трансляции m-файлов в Python
  • Assembler - CorePy


Заключение.
В продаже имеется достаточно литературы по Python (в переводе), к сожалению, литературы по NumPy (переводной, насколько мне известно) пока нет, но для начального использования можно посмотреть несложные примеры из англоязычной документации. Как отмечают некоторые подписчики mail list (и мои собственные наблюдения – 3 года на MATLAB mail list и 2 года на numpy/scipy mail lists), на форумах СПО отвечают более подробно и охотно, чем на коммерческих – и действительно, зачем кому-то помогать Mathsoft зарабатывать деньги? И зачем авторам MATLAB оказывать бесплатную поддержку пользователям, когда они зарабатывают деньги на платной?

В странах СНГ все наступает с запаздыванием (по сравнению с Западом), по-видимому, это справедливо и для использования Python в научно-технических целях. Отсутствие строгого контроля за лицензионностью ПО замедляет внедрение СПО. Автор обращался в МОН с такими письмами, как это, но, конечно же, безрезультатно – да и что ждать от министерства, у которого на сайте приводится адрес сотрудника, занимающегося распространением MATLAB и получающего с этого свои проценты. Поэтому в распространении СПО полагаться на МОН и другие государственные структуры не стоит.

Консультации по Python на русском/украинском языках можно получить на украинском сайте Python-программистов http://python.su. К сожалению, владельцы сайта отказались организовать подфорум - точку сбора (meetpoint) украинских пользователей Python в научно-технических целях, где (кроме тех. поддержки) софтверные организации могли бы набирать людей под свои проекты, возможно, с предварительным обучением. Они аргументировали это небольшим количеством соответствующих пользователей.

Возможно, в будущем Python (так же как и С, Fortran, MATLAB) будет вытеснен Fortress или какими-то другими языками, однако сейчас его использование в научно-технических целях находится на подъеме (прежде всего имеются в виду страны Запада), о чем свидетельствует уже хотя бы резкое увеличение за последние 2 года трафика numpy-user и scipy-user mail lists. Однако этот язык наверняка будет высокоуровневым и производить передачу аргументов по ссылке, поэтому переписывать на него ПО проще всего именно с Python (по моему опыту миграции с MATLAB на Python двумя самыми большими проблемами были передача копированием и индексация массивов с единицы, в случае миграции Python-Fortress эти проблемы отсутствуют). О перспективном языке Fortress, которого его создатели из Sun Microsystems называют наследником Fortran, читайте в следующей статье автора.

См также другие (англоязычные) статьи по использованию Python в научных целях:

\\ by Dmitrey, и.о. м.н.с. отдела оптимизации ИК НАН Украины, http://openopt.org/Dmitrey.

Personal tools