2010-01-25 11 views
32

Chcę obliczyć pola magnetyczne niektórych przewodników za pomocą Biot–Savart law i chcę użyć matrycy 1000x1000x1000. Przed użyciem MATLAB, ale teraz chcę użyć Python. Czy Python jest wolniejszy od MATLAB? Jak mogę przyspieszyć działanie Pythona?Czy MATLAB jest szybszy od Pythona?

EDYTOWANIE: Być może najlepszym sposobem jest obliczyć dużą tablicę za pomocą C/C++, a następnie przenieść je do Pythona. Chcę wizualizować wtedy z VPython.

EDIT2: Co jest lepsze w moim przypadku: C lub C++?

+4

Trudno jest oszacować prędkość bez kodu. Jeśli masz jakiś działający kod Pythona, możesz opublikować go ponownie, aby uzyskać wskazówki dotyczące przyspieszenia. – extraneon

+1

Matlab jest zwykle śmiesznie dobry w optymalizowaniu obliczeń macierzowych. –

+0

@ Blue: poszczególne obliczenia powinny przebiegać dość szybko. Ale nie wiemy, jak dobrze Biot-Savart mapuje obliczenia Matlaba. Jeśli nie jest dobrze przystosowany do wektoryzacji, stanie się raczej powolny. –

Odpowiedz

26

Można znaleźć kilka przydatnych wyników na dole tego linku

http://wiki.scipy.org/PerformancePython

Od wprowadzenia,

Porównanie splocie z NumPy, Pyrex, psyco, Fortran (77 i 90) i C++ do rozwiązania równania Laplace'a.

Porównuje również MATLAB i wydaje się wykazywać podobne prędkości do używania Pythona i NumPy.

Oczywiście jest to tylko konkretny przykład, Twoja aplikacja może pozwolić na lepszą lub gorszą wydajność. Nie ma nic złego w przeprowadzaniu tego samego testu na obu i porównywaniu.

Można również skompilować NumPy ze zoptymalizowanymi bibliotekami, takimi jak ATLAS, co zapewnia pewne procedury BLAS/LAPACK. Powinny one być porównywalne do MATLAB.

Nie jestem pewien, czy pliki do pobrania NumPy są już wbudowane przeciwko niemu, ale myślę, że będzie ATLAS bibliotek dostroić się do systemu, jeśli skompilować NumPy,

http://www.scipy.org/Installing_SciPy/Windows

Link ma więcej szczegółów na temat tego, co jest wymagana w ramach platformy Windows.

EDIT:

Jeśli chcesz dowiedzieć się, co działa lepiej, C lub C++, może warto prosząc nowe pytanie. Chociaż z linku powyżej C++ ma najlepszą wydajność. Inne rozwiązania są również bardzo bliskie, tj. Pyrex, Python/Fortran (przy użyciu f2py) i wbudowany C++.

Jedyną algebrą macierzy pod C++, jaką kiedykolwiek zrobiłem, było użycie MTL i wdrożenie rozszerzonego filtru Kalmana. Sądzę jednak, że w zasadzie zależy to od bibliotek, z których korzystasz LAPACK/BLAS i od tego, jak dobrze jest zoptymalizowana.

Ten link zawiera listę obiektowych pakietów numerycznych dla wielu języków.

http://www.oonumerics.org/oon/

7

Jedynym ważnym testem jest porównanie go. To naprawdę zależy od tego, jaka jest twoja platforma i jak dobrze Biot-Savart Law mapuje do wbudowanych operacji Matlab lub NumPy/SciPy.

Jeśli chodzi o przyspieszenie pisania w Pythonie, Google pracuje nad Unladen Swallow, kompilatorem JIT dla Pythona. Prawdopodobnie istnieją również inne tego typu projekty.

+0

Ale czy mógłbyś podać przybliżoną ocenę? – kame

+1

Niezupełnie. W głębi duszy, jeśli wszystko zostanie zrobione poprawnie, oba będą uruchamiać wektoryzowany kod C. Nie wiem, jak dobrze Matlab jest zoptymalizowany (brak dostępu do kodu) lub NumPy/SciPy (nie wyglądał) pod względem używania instrukcji SSE (lub równoważnych). Nie wiem też, ile szybciej Unladen Swallow stworzy kod Pythona. Istnieje również opcja Matlaba do przechowywania danych w precyzji "podwójnej"; nie mówisz nam, czy twój kod Pythona używa 'float' lub' double' lub czegoś innego. Krótko mówiąc, jest to klasyczny przypadek niewystarczających danych. Tak więc "jedynym ważnym testem jest walka". –

+0

Moje doświadczenie w tej dziedzinie jest ponad sześć lat kończące się siedem lat temu. Użyłem wtedy bibliotek dostarczonych przez kilku dostawców (Intel MKL był jednym z nich). Nacisk Matlaba na używanie "double" w tym czasie (dopiero od niedawna wspierają one unsigned 8-bit) oznaczało, że musieliśmy napisać kilka algorytmów w C lub C++, aby je przyspieszyć. Napisałem więc bibliotekę jako warstwę dla różnych implementacji, aby nasi deweloperzy mieli tylko jeden interfejs API. Niektóre algorytmy wciąż były zbyt wolne i musiały zostać przepisane podczas montażu. Powiedział, że nie widzę, gdzie moja odpowiedź była myląca. –

3

Jeśli używasz tylko Pythona (z NumPy), może być wolniejszy, w zależności od tego, z jakich kawałków korzystasz, niezależnie od tego, czy masz zainstalowane zoptymalizowane biblioteki liniowych algebry i jak dobrze wiesz, jak korzystać z NumPy .

Aby przyspieszyć, można zrobić kilka rzeczy. Istnieje narzędzie o nazwie Cython, które pozwala na dodawanie deklaracji typu do kodu Pythona i tłumaczenie go na moduł rozszerzający Pythona w C. Ile korzyści przyniesie Ci to, zależy od tego, jak bardzo jesteś sumienny z deklaracjami typu - jeśli nie jesteś " t dodać żadnych, nie zobaczysz wiele korzyści. Cython obsługuje także typy NumPy, choć są one nieco bardziej skomplikowane niż inne typy.

Jeśli masz dobrą kartę graficzną i chcesz się trochę nauczyć na temat obliczeń na GPU, pomoc może również uzyskać PyCUDA. (Jeśli nie masz karty graficznej nvidii, słyszę, że PyOpenCL również działa). Nie znam twojej domeny problemowej, ale jeśli można ją zmapować na problem z CUDA, to powinna ona ładnie poradzić sobie z elementami 10^9.

17

NumPy i MATLAB zarówno użyć stanowiącego podstawę BLAS realizacji standardowych operacji algebry liniowej. Przez jakiś czas zarówno używano ATLAS, ale obecnie MATLAB ma również inne implementacje, takie jak Intel's Math Kernel Library (MKL). Który z nich jest szybszy o ile zależy od systemu i jak została skompilowana implementacja BLAS. Możesz także skompilować NumPy z MKL, a Enthought pracuje nad obsługą MKL dla ich dystrybucji w Pythonie (zobacz ich roadmap). Tutaj jest również niedawna interesting blog post na ten temat.

Z drugiej strony, jeśli potrzebujesz bardziej wyspecjalizowanych operacji lub struktur danych, zarówno Python, jak i MATLAB oferują różne sposoby optymalizacji (takie jak Cython, PyCUDA, ...).

Edytuj: Poprawiłem tę odpowiedź, aby uwzględnić różne implementacje BLAS. Mam nadzieję, że teraz jest to uczciwa reprezentacja obecnej sytuacji.

+0

Powinieneś wyjaśnić, co masz na myśli przez "te same podstawowe biblioteki numeryczne". Matlab jest zamkniętym źródłem i jest dłuższy niż Python, a tym bardziej NumPy, więc trudno mi się zastanowić, co może być wspólne, poza zestawem instrukcji SSE. –

+2

Rewizja. Nikt (ja przesadzam) nie pisze procedur manipulacji matrycą, wszyscy je nazywają. Oczywiście, ktoś musi je najpierw napisać, ale gdybyś pisał Matlab lub SciPy, znalazłbyś szybką implementację BLAS dla swojej docelowej platformy (platform) i to zadzwonił. Będę bardzo zaskoczony, gdy dowiem się, że jeden jest znacznie szybszy od drugiego. –

+0

@Mike: Jest to dość powszechna wiedza, ale dla osób bez doświadczenia w komputerach naukowych dodałem trochę więcej informacji w mojej odpowiedzi. – nikow

4

Zgodnie z twoją edycją 2, bardzo mocno polecam używanie Fortranu, ponieważ możesz wykorzystać dostępne podprogramy liniowej algebry (Lapack i Blas) i jest to znacznie prostsze niż C/C++ dla obliczeń macierzowych.

Jeśli preferujesz podejście C/C++, użyłbym C, ponieważ prawdopodobnie potrzebujesz surowej wydajności na przypuszczalnie prostym interfejsie (macierzowe obliczenia mają zazwyczaj proste interfejsy i złożone algorytmy).

Jeśli jednak zdecydujesz się na C++, możesz użyć TNT (Template Numerical Toolkit, implementacja Lapack w C++).

Powodzenia.

+0

Dziękuję za miłą odpowiedź! – kame

0

Chciałbym również zwrócić uwagę, że Python (+ NumPy) może łatwo łączyć się z Fortranem za pośrednictwem modułu F2Py, który zasadniczo nets natywnych prędkości Fortran na kawałkach kodu, które można pobrać do niego.

0

nie mogłam Nie znalazłem zbyt wielu liczb, by odpowiedzieć na to samo pytanie, więc poszedłem dalej i sam je testowałem. Wyniki, skrypty i zestawy danych są dostępne tutaj w moim poście na MATLAB vs Python speed for vibration analysis.

Krótko mówiąc, funkcja FFT w programie MATLAB jest lepsza niż w Pythonie, ale można przeprowadzić prostą manipulację, aby uzyskać porównywalne wyniki i szybkość. Odkryłem także, że importowanie danych było szybsze w Pythonie w porównaniu do MATLAB (nawet dla plików MAT przy użyciu scipy.io).

Powiązane problemy