Tło: Myślę, że mógłbym chcieć przenieść część kodu, który oblicza macierzowe produkty wykładnicze-wektorowe za pomocą metody podprzestrzeni Kryłowa od MATLAB-a do Pythona. (W szczególności funkcja expmvp Jitse Niesen , która wykorzystuje algorytm opisany w tym artykule ). Wiem jednak, że chyba, że intensywnie korzystam z funkcji modułów pochodzących ze skompilowanych bibliotek (tj. Używam tylko surowego Pythona i nie wiele wbudowanych w funkcjach), to może być dość powolne.
Pytanie: Jakie narzędzia lub metody są dostępne, aby pomóc mi przyspieszyć kod napisany w Pythonie w celu zwiększenia wydajności? W szczególności interesują mnie narzędzia, które w jak największym stopniu automatyzują proces, choć mile widziane są również podejścia ogólne.
Uwaga: Mam starszą wersję algorytmu Jitse i od jakiegoś czasu go nie używałem. Stworzenie tego kodu może być bardzo łatwe, ale czułem, że byłby to dobry konkretny przykład i jest on związany z moimi własnymi badaniami. Omówienie mojego podejścia do implementacji tego konkretnego algorytmu w Pythonie to zupełnie inne pytanie.
źródło
Odpowiedzi:
Podzielę moją odpowiedź na trzy części. Profilowanie, przyspieszenie kodu Pythona za pomocą c i przyspieszenie Pythona za pomocą Pythona. Moim zdaniem Python ma jedne z najlepszych narzędzi do sprawdzania wydajności twojego kodu, a następnie drążenia w dół do rzeczywistych szyjek butelek. Przyspieszenie kodu bez profilowania jest jak próba zabicia jelenia za pomocą uzi.
Jeśli naprawdę interesują Cię tylko produkty mat-vec, polecam scipy.sparse .
Narzędzia Python do profilowania
profile i moduły cProfile : te moduły zapewniają standardową analizę czasu działania i stos wywołań funkcji. Ładnie jest zapisać ich statystyki, a korzystając z modułu pstats możesz przeglądać dane na wiele sposobów.
kernprof : to narzędzie łączy wiele procedur służących do wykonywania takich czynności jak synchronizacja kodu linia po linii
memory_profiler : to narzędzie generuje odcisk linii wiersz po wierszu kodu.
Timery IPython :
timeit
Funkcja jest całkiem przyjemna, gdy widzi różnice w funkcjach w szybki interaktywny sposób.Przyspieszenie Pythona
Cython : cython to najszybszy sposób na skorzystanie z kilku funkcji w Pythonie i uzyskanie szybszego kodu. Możesz ozdobić funkcję wariantem cytonu Pythona, który generuje kod c. Jest to bardzo łatwe w utrzymaniu i może również łatwo łączyć się z innym ręcznie napisanym kodem w c / c ++ / fortran. Obecnie jest to zdecydowanie preferowane narzędzie.
ctypes : ctypes pozwoli ci napisać twoje funkcje wc, a następnie szybko je zawinąć dzięki prostej dekoracji kodu. Radzi sobie z bólem związanym z rzucaniem z PyObjectów i zarządzaniem gilem, aby wywołać funkcję c.
Istnieją inne podejścia do pisania kodu w C, ale wszystkie są nieco bardziej przydatne do pobierania biblioteki C / C ++ i pakowania w Pythona.
Podejścia oparte wyłącznie na języku Python
Jeśli chcesz pozostać w Pythonie głównie, radzę dowiedzieć się, jakich danych używasz i wybrać odpowiednie typy danych do implementacji algorytmów. Z mojego doświadczenia wynika, że optymalizacja struktur danych zwykle odbywa się znacznie dalej, niż w przypadku jakiegokolwiek hakowania na niskim poziomie. Na przykład:
numpy : tablica poboczna bardzo szybka dla krokowych operacji tablic
numexpr : optymalizator wyrażeń tablic numpy. Pozwala na wielowątkowe wyrażenia tablic numpy, a także pozbywa się licznych tymczasowych marek numpy ze względu na ograniczenia interpretera Pythona.
blist : implementacja b-drzewa listy, bardzo szybka do wstawiania, indeksowania i przenoszenia wewnętrznych węzłów listy
pandy : ramki danych (lub tabele) bardzo szybkie analizy na tablicach.
pytable : szybkie strukturyzowane tabele hierarchiczne (jak hdf5), szczególnie przydatne do obliczeń poza zapytaniami i zapytań do dużych danych.
źródło
Przede wszystkim, jeśli dostępna jest implementacja C lub Fortran (funkcja MATLAB MEX?), Dlaczego nie piszesz otoki Pythona?
Jeśli chcesz mieć własną implementację nie tylko otoki, zdecydowanie zalecam użycie modułu numpy do algebry liniowej. Upewnij się, że jest on połączony ze zoptymalizowanym plikiem blas (takim jak ATLAS, GOTOblas, uBLAS, Intel MKL, ...). I użyj Cython lub splot. Przeczytaj ten artykuł dotyczący wydajności w Pythonie, aby uzyskać dobre wprowadzenie i test porównawczy. Różne implementacje w tym artykule są dostępne do pobrania tutaj dzięki uprzejmości Travisa Oliphanta (Numpy-guru).
Powodzenia.
źródło
scipy.weave
nadal używany i rozwijany? Wygląda na to, że artykuł Performance Python pokazuje, że może być szybki w użyciu i daje całkiem niezłą poprawę prędkości, ale rzadko widuje się go poza tym artykułem.Zasadniczo zgadzam się z innymi odpowiedziami. Najlepsze opcje szybkiego
python
kodu numerycznego tonumpy
python
-program mógł go wywołać bezpośrednioAle jeśli chcesz zaprogramować cały algorytm od zera (cytuję: „Używam tylko surowego Pythona”), możesz rozważyć http://pypy.org/ implementację JIT (Just In Time)
python
. Nie byłem w stanie użyć go do mojego projektu (ponieważ to zależy od tego,numpy
apypy
chłopaki pracują nad tym, aby to wspierać), ale testy porównawcze są imponujące ( http://speed.pypy.org/ )źródło
Niektóre z powyższych linków są nieaktualne, dlatego spójrz tutaj:
http://wiki.scipy.org/PerformanceTips
http://wiki.scipy.org/PerformancePython
Jakieś pomysły:
Numpy, Numba, Cython, Numexpr, Theano, Tensorflow, f2py, CPython C API, pypy, cffi, Pythran, Nuitka, swig, boost.python
źródło