Py4science

From Wikimization

(Difference between revisions)
Jump to: navigation, search
m (Reverted edits by 194.158.198.3 (Talk); changed back to last version by Dattorro)
m (Protected "Py4science" [edit=autoconfirmed:move=autoconfirmed])

Revision as of 05:19, 17 February 2010

Использование языка Python для разработки научно-технического программного обеспечения
(English)


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


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

Прежде всего, низкоуровневые языки, такие как С, C++, Fortran, Assembler, не позволяют RAD (Rapid Application Development - быстрая разработка приложений). Приходится тратить много времени на компиляцию и линкование, а пользоваться отладчиком многие не умеют (особенно школьники и студенты). Кроме того, и С, и Fortran являются "Write Only Language" (особенно это актуально для Perl, где написанный код понимает только его автор, и то обычно не дольше 15 минут). Как правило, часто требуется также синхронизация (автоматическая или ручная) 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% в год за обновления библиотек
  • за границей (Китай, Бразилия и тп, особенно Европа, в которой более строго с нелицензионным ПО), где осознали всю негативную сторону зависимости от коммерческого ПО, начинается мощное движение о переходе на свободное ПО в образовании, муниципальных и других государственных структурах. Со временем это приведет к улучению качества СПО, так что миграция и программистов, и заказчиков, и пользователей только ускорится. Поэтому сделавшие ставку на эти коммерческое пакеты в будущем могут об этом пожалеть, т.к. качественно переписать тысячи строк кода (тем более, научного-технического), особенно если организация не распологает квалифицированными в обоих языках специалистами - задача непростая и технически, и финансово.

Кстати, уже хотя бы поэтому тем программистам, у кого есть способности в точных науках, и стоит устраиваться на работу в научно-технические проекты, требующие высокой технической квалификации - меньше вероятность, что заказчик через какое-то время решит сменить разработчика всех этих сайтов, веб-приложений, GUI и т.п. на каких-нибуть школьников из Индии или Китая, способных (и согласных) выполнять ту же работу в 2-3 раза дешевле. А вы еще не задумывались, сколько в Индии или Китае таких школьников?

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

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

В одном из сообщений 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 конечно же есть и свои недостатки:

  • 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). Они (и их списки почтовых рассылок – 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, чтобы оно не мельтешило при включении/отключении отладчика, удалить с панели ненужные кнопки (например, для плагинов) и раздвинуть оставшиеся, чтобы была видна кнопка сохранения файлов. Впрочем, система hot-keys в Eric достаточно удобная, поэтому проще пользоваться ей, а не панелью.
Посмотреть на snapshot настроенного таким образом Eric можно здесь.

Все 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

В NASA и ряде других организаций обычно практикуется следующий подход:

  • все, что можно, пишется на Python+numpy (конечно, используются и scipy, и другие библиотеки)
  • то, что требует большей скорости, пишется на Pyrex (сейчас уже Cython)
  • то, что требует еще большей скорости, пишется на C/С++, Fortran (и подключается через Cython. f2py)
  • то, что требует максимальной скорости, пишется на Assembler.

Если есть потребность в миграции проекта с С/С++/Fortran на Python, это обычно проходит "островным" способом - по очереди переписываются отдельные функции.


Заключение.

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

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

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

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


См также:


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

Personal tools