Py4science

From Wikimization

(Difference between revisions)
Jump to: navigation, search
Line 105: Line 105:
Недостатком 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 являются проблемы с установкой, особенно с его зависимостями (лучше всего через 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, чтобы оно не мельтешило при включении/отключении отладчика.
+
После установки Eric рекомендуется сразу же произвести начальную настройку - удалить подсветку текущего слова (и изменить цвет для подсветки других случаев с красного на какой-то получше), выставить типы файлов по умолчанию для сохранить/загрузить "py" (Python), удалить или переставить окно project-viewer, чтобы оно не мельтешило при включении/отключении отладчика.
Все 3 рассмотренные среды разработки имеют conditional breakpoints, интеграцию с версионными системами (cvs, svn и тд) и практически полный спектр стандартных услуг.
Все 3 рассмотренные среды разработки имеют conditional breakpoints, интеграцию с версионными системами (cvs, svn и тд) и практически полный спектр стандартных услуг.

Revision as of 13:53, 10 February 2009

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


Предисловие.
В этой статье мы рассмотрим преимущества и недостатки использования языка Python в научно-инженерных приложениях как альтернативы традиционным C, C++, Fortran и, прежде всего, MATLAB, Octave и других математических пакетов. Статья написана по мотивам одноименного семинара, прошедшего 5.02.09 в институте кибернетики НАНУ. Там я допустил ряд оговорок, которые и собираюсь исправить в этой статье (перед докладом присутствующие попросили сократить его с предложенных мне начальством и планировавшихся 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 в 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, это не распространяется. Подробнее см http://jarrodmillman.blogspot.com/2009/01/when-will-numpy-and-scipy-migrate-to.html


Основные дистрибутивы 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).


Основные среды разработки для 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 являются проблемы с установкой, особенно с его зависимостями (лучше всего через 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 - http://wiki.python.org/moin/IntegratedDevelopmentEnvironments


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

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


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

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

Консультации по Python на русском/украинском языках можно получить на украинском сайте Python-программистов http://python.su.

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

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

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

Personal tools