Fortran или C и f2py для решения дифференциальных уравнений

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

Однако нам нужно, чтобы интегратор был быстрым, поэтому мы хотим использовать адаптивные размеры шагов и протестировать некоторые другие процедуры, не включенные в пакеты scipy. В связи с этим у меня возник вопрос f2py, так как имеет смысл написать решатель ODE на фортране или C и обернуть его с помощью f2py. Где происходит «замедление» при взаимодействии между fortran, например, и python? Это в переносе памяти туда и обратно? Мне интересно, что мне нужно учитывать на переднем конце. Конечно, я мог бы написать это прямо на питоне (для начала), но я слышал, что зацикливание на питоне очень медленное.

Во всяком случае, просто ищу общие советы и вещи для рассмотрения.

Спасибо.


person AD0AE    schedule 29.11.2015    source источник
comment
вы можете написать все это на C (или на фортране) - Рунге Кутта 4-го порядка - популярный метод, немного сложный для программирования, но работает хорошо. Коммерческим пакетом будет Comsol.   -  person tom    schedule 30.11.2015


Ответы (1)


Я не знаком с f2py, но не думали ли вы сначала попробовать Cython? Если вы не знакомы с ним, он позволяет вам писать код на расширенном наборе стандартного языка Python, а затем переводит его в код C, который затем компилируется. Если ваш код состоит в основном из циклов, это может немного его ускорить. Имейте в виду, однако, что каждый раз, когда вы вызываете чистую функцию Python из Cython (или из обычного кода C, если на то пошло), это создает узкое место. (Я полагаю, что это замедление, о котором вы говорили.)

При этом я недавно выбросил модуль Cython, который написал, и заменил его написанной от руки библиотекой C++, используя ссылку API Python/C. Это было лучше, поскольку давало мне больше контроля над взаимодействием кода C++ с NumPy, что было немного сложно с Cython.

person jb326    schedule 30.11.2015
comment
Доступна ли ваша библиотека C++ в Интернете для изучения или она предназначена для личного/частного проекта? - person cbcoutinho; 05.07.2017
comment
@cbcoutinho По иронии судьбы, с тех пор, как я опубликовал этот ответ, я вернулся к использованию Cython, потому что библиотеку C ++, использующую API Python, было слишком сложно поддерживать. Так что нет, извините, этот код больше недоступен. Тем не менее, в документации по Cython описано, как вызывать библиотеки C из кода Cython, чем я сейчас и занимаюсь, так что я бы порекомендовал взглянуть на это. - person jb326; 05.07.2017
comment
Спасибо, что так быстро ответили мне @ jb326, я прихожу к тому же выводу, что и вы, хотя я работаю с дополнительным бонусом в виде библиотеки Fortran вместо библиотеки на основе C. Пока я проверил ctypes, cython и CFFI. Я обнаружил, что cython и cffi немного сложно понять с точки зрения Fortran, потому что все было очень ориентировано на C по отношению к C. структуры c-данных, указатели и т. д. Прямо сейчас я использую ctypes и numpy, но он все еще кажется неуклюжим и склонным к ошибкам из-за отсутствия у меня опыта работы с C. - person cbcoutinho; 05.07.2017