Я постараюсь ответить на ваш вопрос, учитывая, что вы просите Python специально. Я опишу свой собственный метод решения проблемы моделирования. Стратегии для более быстрого моделирования приведены в этом описании.
Сначала я создаю новые модели в Python. Конечно, я стараюсь максимально использовать NumPy и SciPy . В то время как NumPy предоставляет подходящий тип данных массива для численного моделирования, SciPy предлагает широкие числовые процедуры для работы с массивами NumPy.
Когда прототипы работают более или менее, я пытаюсь понять, какие части программы или сценария являются узким местом. Для этого есть типичные кандидаты:
- Циклы в Python медленные. Очень медленно.
- Поскольку Python использует типизацию утилит , вызов функций может быть медленным.
Я использую простую стратегию профилирования, чтобы узнать, на что тратится все время выполнения. Используя оболочку IPython (которую я не могу рекомендовать достаточно), я запускаю свой скрипт с
%timeit script.py
Эта «волшебная команда» выполнит профилирование (используя timeit ) за вас и предоставит вам список со временем, как только ваш скрипт завершит работу. Используйте этот список, чтобы узнать, где ваш код слишком медленный.
После того, как вы прибавили части, которые необходимо ускорить, вы можете рассмотреть возможность использования скомпилированных языков. Я укажу на два решения.
Во-первых, это язык Cython . Cython - это язык программирования, очень похожий на Python (фактически, код Python также часто является допустимым кодом Python); однако компилятор Cython преобразует файлы Cython в код C, который затем может быть скомпилирован в модуль, используемый из Python. Cython понимает массивы NumPy. Существует два способа использования Cython: во-первых, вы можете вводить типы данных. Это ускорит вызовы функций. Также, если вы перебираете массивы, ваш цикл будет работать быстрее (фактически, если вы введете как фиктивную переменную, так и массив, вы получите простой цикл C!). Во-вторых, в моих экспериментах даже нетипизированные скрипты работают немного быстрее из-за того, что они компилируются, а не интерпретируются.
Другой скомпилированный язык, который будет вам полезен, это Fortran. Существуют разные способы использования Fortran с Python ( f2py , fortwrap , Cython ). Лично для меня f2py кажется самым простым способом, я быстро опишу, что он делает. f2py может компилировать код Фортрана в модули Python. Это позволит вам использовать массивы NumPy в качестве входных и выходных переменных из пространства Python. В пространстве Фортрана это будут обычные массивы Фортрана. Вы можете работать с ними на полной скорости Фортрана.
Лично я склонен использовать Cython, где количество вызовов функций является узким местом. Для вещей с большим количеством петель я предпочитаю f2py (возможно, потому что у меня сильный фон Fortran).
На дополнительном замечании о Фортране: современный Фортран читает и пишет очень похоже на NumPy - синтаксис очень близок. Это позволяет легко конвертировать код NumPy в код Fortran.
Обратите внимание, что и Cython, и f2py поддерживают параллелизм в некотором роде. Для Cython вы найдете здесь помощь , тогда как для Fortran существуют стандартные методы, такие как OpenMP или MPI. Кроме того, существуют также обертки для Python для MPI . Лично я использую mpi4py на уровне Python, а также OpenMP в Fortran.
Позвольте мне порекомендовать немного литературы: книгу « Сценарии Python для вычислительной науки » Х.-П. Langtangen - отличный ресурс по Python в целом, а также по стратегиям, позволяющим сделать Python немного быстрее. К сожалению, AFAIR, он ничего не упоминает о Cython. В качестве второго ресурса вы можете посмотреть на эти слайды . Они дают примеры для всего, что я упомянул в этом посте (см. Также код и источники здесь ). Есть много других хороших слайдов в Интернете.
Если у вас есть более конкретные вопросы, мы все рады помочь!