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.