Spróbuję odpowiedzieć na twoje pytanie, biorąc pod uwagę, że pytasz konkretnie o Pythona. Opiszę własną metodę rozwiązania problemu symulacji. W tym opisie podano strategie szybszych symulacji.
Najpierw prototypuję nowe symulacje w Pythonie. Oczywiście staram się korzystać z NumPy i SciPy w miarę możliwości. Podczas gdy NumPy zapewnia odpowiedni typ danych tablicowych do symulacji numerycznych, SciPy oferuje szerokie procedury numeryczne działające z tablicami NumPy.
Gdy prototypy zaczną działać mniej więcej, próbuję dowiedzieć się, które części programu lub skryptu stanowią wąskie gardło. Są na to typowi kandydaci:
- Pętle w Pythonie są wolne. Bardzo wolno.
- Ponieważ Python używa pisania kaczego , funkcje wywoływania mogą być wolne.
Używam prostej strategii profilowania, aby dowiedzieć się, gdzie spędzany jest cały czas działania. Używając powłoki IPython (której nie mogę wystarczająco polecić), uruchamiam skrypt
%timeit script.py
To „magiczne polecenie” wykona dla ciebie profilowanie (używając timeit ) i wyświetli listę czasów, kiedy skrypt się zakończy. Skorzystaj z tej listy, aby dowiedzieć się, gdzie twój kod jest zbyt wolny.
Po przybiciu części, które należy przyspieszyć, możesz rozważyć użycie skompilowanych języków. Wskażę dwa rozwiązania.
Po pierwsze, istnieje język Cython . Cython jest językiem programowania bardzo podobnym do Pythona (w rzeczywistości kod Pythona jest często również prawidłowym kodem Pythona); jednak kompilator Cython konwertuje pliki Cython na kod C, który następnie można skompilować w moduł używany z Pythona. Cython rozumie tablice NumPy. Są dwa sposoby, w których użycie Cython może ci pomóc: po pierwsze, możesz wprowadzić typy danych. Przyspieszy to wywołania funkcji. Ponadto, jeśli wykonasz iterację po tablicach, twoja pętla będzie działać szybciej (w rzeczywistości, jeśli wpiszesz zarówno zmienną fikcyjną, jak i tablicę, otrzymasz zwykłą pętlę C!). Po drugie, w moich eksperymentach nawet nieskryptowane skrypty działają nieco szybciej, ponieważ są one kompilowane zamiast interpretowane.
Innym skompilowanym językiem, który będzie ci przydatny, jest Fortran. Istnieją różne sposoby korzystania z Fortran z Pythonem ( f2py , fortwrap , Cython ). Jeśli chodzi o mnie osobiście, f2py wydaje się najłatwiejszym sposobem, szybko opiszę, co robi. f2py może kompilować kod Fortran do modułów Pythona. Umożliwi to użycie tablic NumPy jako zmiennych wejściowych i wyjściowych z przestrzeni Pythona. W przestrzeni Fortran będą to zwykłe tablice Fortrana. Możesz operować nimi przy pełnej prędkości Fortrana.
Osobiście zwykle używam Cython, gdzie liczba wywołań funkcji jest wąskim gardłem. W przypadku rzeczy z dużą ilością pętli wolę f2py (może dlatego, że mam silne tło Fortran).
Na dodatkowe uwagi na temat Fortran: nowoczesny Fortran czyta i pisze bardzo podobnie do NumPy - składnia jest bardzo bliska. Ułatwia to konwersję kodu NumPy na kod Fortran.
Zauważ, że zarówno Cython, jak i f2py w jakiś sposób wspierają paraliżizm. W przypadku Cython znajdziesz tutaj pomoc , natomiast w przypadku Fortran istnieją standardowe techniki, takie jak OpenMP lub MPI. Ponadto istnieją również opakowania Pthon dla MPI . Osobiście używam mpi4py na poziomie Python, a także OpenMP w Fortran.
Pozwól mi polecić trochę literatury: książkę Python Scripting For Computational Science autorstwa H.-P. Langtangen jest świetnym źródłem informacji o Pythonie, a także o strategiach, dzięki którym Python jest nieco szybszy. Niestety, AFAIR, nie wspomina nic o Cython. Jako drugi zasób możesz obejrzeć te slajdy . Dają one przykłady wszystkiego, o czym wspomniałem w tym poście (zobacz także kod i źródła tutaj ). Istnieje wiele innych dobrych zestawów slajdów w Internecie.
Jeśli masz bardziej szczegółowe pytania, wszyscy chętnie Ci pomożemy!