czy można przekonwertować program w języku Python na C / C ++?
Muszę zaimplementować kilka algorytmów i nie jestem pewien, czy luka w wydajności jest wystarczająco duża, aby uzasadnić cały ból, przez który przechodziłbym, robiąc to w C / C ++ (w czym nie jestem dobry). Myślałem o napisaniu jednego prostego algorytmu i porównaniu go z tak przekonwertowanym rozwiązaniem. Jeśli samo to jest znacznie szybsze niż wersja Pythona, nie mam innego wyjścia, jak zrobić to w C / C ++.
c++
python
c
code-generation
CrazyFlyingCloseline
źródło
źródło
Odpowiedzi:
Tak. Spójrz na Cythona . Robi tylko to: konwertuje Pythona do C w celu przyspieszenia.
źródło
cdef
deklaracji i tym samym wprowadzisz statyczne pisanie (w przeciwnym razie po prostu żonglujesz nieprzezroczystymiPyObject *
rzeczami). I nigdy nie będzie tak szybki jak zwykły C, ponieważ zwykle łączy się z Pythonem (100% lub więcej? Tylko dla zwykłego kodu numerycznego, który w ogóle nie współpracuje z Pythonem przez większość czasu!). Ale poza tym, tak, może to przynieść całkiem sprytne przyspieszenie.„inwestować” nie jest tutaj właściwym słowem.
Zbuduj działającą implementację w Pythonie. Skończysz to na długo przed ukończeniem wersji C.
Zmierz wydajność za pomocą profilera języka Python. Rozwiąż wszystkie znalezione problemy. Zmień struktury danych i algorytmy, jeśli to konieczne, aby naprawdę zrobić to poprawnie. Skończysz to na długo przed ukończeniem pierwszej wersji w C.
Jeśli nadal jest zbyt wolny, przetłumacz ręcznie dobrze zaprojektowany i starannie skonstruowany Python na C.
Ze względu na sposób, w jaki działa to z perspektywy czasu, wykonanie drugiej wersji z istniejącego Pythona (z istniejącymi testami jednostkowymi i istniejącymi danymi profilowania) będzie nadal szybsze niż próba wykonania kodu C od zera.
Ten cytat jest ważny.
źródło
Shed Skin jest „(ograniczonym) kompilatorem Pythona do C ++”.
źródło
Właśnie natknąłem się na to nowe narzędzie w wiadomościach dla hakerów.
Z ich strony - „Nuitka jest dobrym zamiennikiem dla interpretera Pythona i kompiluje każdą konstrukcję oferowaną przez CPython 2.6, 2.7, 3.2 i 3.3. Przekłada Pythona na program C ++, który następnie używa„ libpython ”do wykonania w taki sam sposób jak CPython robi to w bardzo zgodny sposób ”.
źródło
.exe
rozszerzeniem na OSX, mimo że jest to całkowicie normalny plik wykonywalny Mach-O OSX. Wygląda na to, może być dobrym zamiennikiempyinstaller
,py2exe
,py2app
, itd. Te--recurse-***
flagi są ważne, aby prawidłowo ustawić chociaż.Inną opcją - konwersję do C ++ oprócz Shed Skin - jest Pythran .
Cytując High Performance Python autorstwa Micha Gorelick i Iana Ozsvalda :
źródło
Wiem, że to starszy wątek, ale chciałem przekazać informacje, które uważam za pomocne.
Osobiście używam PyPy, które jest naprawdę łatwe do zainstalowania za pomocą pip. Używam zamiennie interpretera Python / PyPy, nie musisz w ogóle zmieniać swojego kodu i stwierdziłem, że jest około 40x szybszy niż standardowy interpreter Pythona (albo Python 2x lub 3x). Używam pyCharm Community Edition do zarządzania moim kodem i uwielbiam to.
Lubię pisać kod w Pythonie, ponieważ myślę, że pozwala skupić się bardziej na zadaniu niż na języku, co jest dla mnie ogromnym plusem. A jeśli chcesz, aby był jeszcze szybszy, zawsze możesz skompilować do pliku binarnego dla systemu Windows, Linux lub Mac (nie jest to proste, ale możliwe przy użyciu innych narzędzi). Z mojego doświadczenia wynika, że podczas kompilacji uzyskuję około 3,5-krotne przyspieszenie w porównaniu z PyPy, czyli 140 razy szybciej niż w Pythonie. PyPy jest dostępny dla kodu Python 3x i 2x i ponownie, jeśli używasz IDE, takiego jak PyCharm, możesz bardzo łatwo przełączać się między, powiedzmy, PyPy, Cython i Python (chociaż wymaga trochę początkowej nauki i konfiguracji).
Niektórzy ludzie mogą się ze mną spierać w tej sprawie, ale uważam, że PyPy jest szybszy niż Cython. Ale oba są świetnym wyborem.
Edycja: Chciałbym zrobić kolejną krótką notatkę o kompilacji: kiedy kompilujesz, wynikowy plik binarny jest znacznie większy niż twój skrypt Pythona, ponieważ buduje w nim wszystkie zależności itp. Ale wtedy masz kilka wyraźnych korzyści: szybkość !, teraz aplikacja będzie działać na każdym komputerze (w zależności od tego, dla którego systemu operacyjnego skompilowałeś, jeśli nie na wszystkich. lol) bez Pythona lub bibliotek, zaciemnia również twój kod i jest technicznie gotowa do produkcji (do pewnego stopnia). Niektóre kompilatory generują również kod C, którego tak naprawdę nie oglądałem ani nie widziałem, czy jest przydatny lub po prostu bełkot. Powodzenia.
Mam nadzieję, że to pomoże.
źródło
Zdaję sobie sprawę, że brakuje odpowiedzi na całkiem nowe rozwiązanie. Jeśli w kodzie użyto Numpy, radziłbym wypróbować Pythran:
http://pythran.readthedocs.io/
W przypadku funkcji, które wypróbowałem, Pythran daje bardzo dobre wyniki. Wynikowe funkcje są równie szybkie, jak napisany kod Fortran (lub tylko nieco wolniejszy) i trochę szybciej niż (dość zoptymalizowane) rozwiązanie Cython.
Zaletą w porównaniu do Cythona jest to, że wystarczy użyć Pythrana na funkcji Pythona zoptymalizowanej pod kątem Numpy, co oznacza, że nie trzeba rozszerzać pętli i dodawać typów dla wszystkich zmiennych w pętli. Pythran nie spieszy się z analizą kodu, aby rozumiał operacje na
numpy.ndarray
.To także ogromna zaleta w porównaniu z Numbą czy innymi projektami opartymi na kompilacji just-in-time, dla których (o ile wiem) trzeba poszerzać pętle, żeby były naprawdę wydajne. A potem kod z pętlami staje się bardzo, bardzo nieefektywny, używając tylko CPython i Numpy ...
Wada Pythrana: brak klas! Ale ponieważ trzeba skompilować tylko te funkcje, które naprawdę wymagają optymalizacji, nie jest to zbyt denerwujące.
Kolejna uwaga: Pythran dobrze (i bardzo łatwo) obsługuje równoległość OpenMP. Ale nie sądzę, że mpi4py jest obsługiwane ...
źródło
http://code.google.com/p/py2c/ wygląda na możliwość - wspominają również na swojej stronie: Cython, Shedskin i RPython i potwierdzają, że konwertują kod Pythona na czysty C / C ++, który jest znacznie szybszy niż C / C ++ podziurawiony wywołaniami API Pythona. Uwaga: nie próbowałem tego, ale zamierzam ...
źródło