Chcę zaimplementować następujące wyrażenie w Pythonie: gdzie x i y są tablicami liczbowymi o rozmiarze n , a k to tablica liczbowa o wielkości n × n . Rozmiar n może wynosić do około 10000, a funkcja jest częścią wewnętrznej pętli, która będzie oceniana wiele razy, więc szybkość jest ważna.
Idealnie chciałbym całkowicie uniknąć pętli for, choć myślę, że to nie koniec świata, jeśli taki istnieje. Problem polega na tym, że mam problem z widzeniem, jak to zrobić bez posiadania kilku zagnieżdżonych pętli, co może spowolnić.
Czy ktoś może zobaczyć, jak wyrazić powyższe równanie za pomocą numpy w sposób, który jest wydajny, a najlepiej także czytelny? Mówiąc bardziej ogólnie, jaki jest najlepszy sposób podejścia do tego rodzaju rzeczy?
Odpowiedzi:
Oto rozwiązanie Numba. Na mojej maszynie wersja Numba jest> 1000x szybsza niż wersja python bez dekoratora (dla matrycy 200x200, „k” i wektora o długości 200 „a”). Możesz także użyć dekoratora @autojit, który dodaje około 10 mikrosekund na połączenie, dzięki czemu ten sam kod będzie działał z wieloma typami.
Ujawnienie: Jestem jednym z programistów Numba.
źródło
Oto początek. Po pierwsze przepraszam za błędy.
Edycja: Nie, górny limit był prawidłowy, jak podano w pytaniu. Zostawiłem go tak, jak jest tutaj, ponieważ inna odpowiedź używa teraz tego samego kodu, ale poprawka jest prosta.
Najpierw zapętlona wersja:
Zrobiłem z tego jedną pętlę z numpy plasterkami:
Potem napisałem cytowaną wersję (bardziej czytelnego) zapętlonego kodu.
Na moim laptopie ten jest około 200 razy szybszy niż wersja zapętlona (i 8 razy szybszy niż wersja wektoryzowana w 1 pętli). Jestem pewien, że inni mogą zrobić lepiej.
Grałem z wersją Julii i wydawało mi się (jeśli odpowiednio ją zaplanowałem) porównywalną z kodem Cython.
źródło
To, czego chcesz, wydaje się być splotem; Myślę, że najszybszym sposobem na osiągnięcie tego celu byłaby
numpy.convolve
funkcja.Być może będziesz musiał naprawić indeksy zgodnie z własnymi potrzebami, ale myślę, że chcesz spróbować czegoś takiego:
źródło