Я спробую відповісти на ваше запитання, враховуючи, що ви просите конкретно про 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 може допомогти вам: спочатку ви можете ввести типи даних. Це пришвидшить функціональні дзвінки. Крім того, якщо ви перейдете до масивів, ваш цикл запуститься швидше (адже, якщо ви введете і манекенну змінну, і масив, ви отримаєте звичайний цикл С!). По-друге, в моїх експериментах навіть нетипізовані сценарії працюють трохи швидше через те, що вони складені замість інтерпретованих.
Інша складена мова, яка буде корисною для вас, - Fortran. Існують різні способи використання Fortran з Python ( f2py , fortwrap , Cython ). Щодо мене особисто f2py здається найпростішим способом, я швидко опишу, що він робить. f2py може компілювати код Fortran в модулі Python. Це дозволить використовувати масиви NumPy як вхідні та вихідні змінні з простору Python. У просторі Fortran це будуть звичайні масиви Fortran. Ви можете працювати з ними на повній швидкості Fortran.
Особисто я схильний використовувати Cython, де кількість викликів функцій є вузьким місцем. Що стосується важких циклів, я віддаю перевагу f2py (можливо тому, що у мене сильний фон Fortran).
Додатково про Fortran: сучасний Fortran читає і пише дуже схоже на NumPy - синтаксис дуже близький. Це дозволяє легко перетворити код NumPy в код Fortran.
Зауважте, що і Cython, і f2py певним чином підтримують паралелізм. Для Cython ви знайдете допомогу тут , тоді як для Fortran є стандартні методи, такі як OpenMP або MPI. Крім того, є також P ython обгортки для MPI . Особисто я використовую mpi4py на рівні Python, а також OpenMP у Fortran.
Дозвольте порекомендувати трохи літератури: книгу Python Scripting For Computation Science від H.-P. Langtangen - це чудовий ресурс як для Python, так і для стратегій зробити Python трохи швидшим. На жаль, AFAIR, на Cython нічого не згадується. Як я другий ресурс, ви можете переглянути ці слайди . Вони наводять приклади всього, про що я згадував у цій публікації (див. Також код та джерела тут ). В Інтернеті є багато інших хороших наборів слайдів.
Якщо у вас є більш конкретні запитання, ми всі раді допомогти!