Czy Python jest szybszy i lżejszy niż C ++? [Zamknięte]


92

Zawsze myślałem, że zalety Pythona to czytelność kodu i szybkość programowania, ale czas i zużycie pamięci nie były tak dobre, jak w C ++.

Te statystyki uderzyły mnie naprawdę mocno.

Co twoje doświadczenie mówi ci o wykorzystaniu czasu i pamięci w Pythonie w porównaniu z C ++?


18
Więc Pyhton jest w większości przypadków wolniejszy i zużywa więcej pamięci RAM, ale źródło jest mniejsze. Na czym dokładnie polega problem?
nuriaion

2
Chyba źle zinterpretowałem wyniki.
Alex

6
Co jest naprawdę interesujące, testy w C ++ są nadal „lepsze” niż testy w C!
gbjbaanb

9
@gbjbaanb: To mnie nie dziwi. C ++ dodał wiele funkcji, które umożliwiają potencjalnie szybszy kod. Jeśli wiesz, co robisz, C ++ może być absurdalnie wydajny, bardziej niż C. (Oczywiście C ++ zawiera również pewne funkcje, które szkodzą wydajności, ale nie musisz ich używać). Jednak powszechne przekonanie, że „C jest szybsze niż C ++” jest błędne. (a pytanie nie jest zbyt znaczące w pierwszej kolejności)
jalf

1
Link nie działa
Arn

Odpowiedzi:


240

Myślę, że źle czytasz te statystyki. Pokazują, że Python jest około 400 razy wolniejszy niż C ++ iz wyjątkiem jednego przypadku, Python jest raczej świnią pamięci. Jednak jeśli chodzi o rozmiar źródła, Python wygrywa.

Moje doświadczenia z Pythonem pokazują ten sam zdecydowany trend, w którym Python jest od 10 do 100 razy wolniejszy niż C ++ podczas wykonywania poważnych operacji na liczbach. Istnieje wiele powodów, z których główne to: a) Python jest interpretowany, podczas gdy C ++ jest kompilowany; b) Python nie ma prymitywów, wszystko, łącznie z typami wbudowanymi (int, float, itp.) jest obiektami; c) lista Pythona może zawierać obiekty różnego typu, więc każdy wpis musi przechowywać dodatkowe dane o swoim typie. To wszystko poważnie utrudnia zarówno czas wykonywania, jak i zużycie pamięci.

Nie jest to jednak powód, aby ignorować Pythona. Wiele programów nie wymaga dużo czasu ani pamięci, nawet przy współczynniku spowolnienia wynoszącym 100. Koszt rozwoju to ten, w którym Python wygrywa dzięki prostemu i zwięzłemu stylowi. Ta poprawa kosztów rozwoju często przewyższa koszt dodatkowych zasobów procesora i pamięci. Jeśli tak się nie stanie, wygrywa C ++.


111
Ponadto ludzie, którzy mówią, że Python jest powolny w przypadku poważnego chrupania liczb, nie używali modułów Numpy i Scipy. Obecnie Python naprawdę zyskuje na popularności w obliczeniach naukowych. Oczywiście szybkość wynika z wykorzystania modułów napisanych w C lub bibliotek napisanych w Fortranie, ale moim zdaniem na tym polega piękno języka skryptowego.
Justin Peel

3
Zapewniam, co powiedziałeś, i to link, aby to udowodnić: blog.dhananjaynene.com/2008/07/…
ucefkh

2
W odniesieniu do: c) lista w Pythonie może zawierać obiekty różnego typu, więc każdy wpis musi przechowywać dodatkowe dane o swoim typie. Lista Pythona to tak naprawdę lista wskaźników do obiektów. W Pythonie jest to wartość, która zna swój typ, podczas gdy zmienna jest tylko wskaźnikiem do „ogólnego obiektu wartości” (dlatego liczby parzyste są niezmienne). Tak więc listy nie przechowują typów zawartości - tylko wskaźniki. Masz jednak rację co do narzutu pamięci - Python musi przechowywać typ i inny kontekst dla wartości dowolnego typu.
Alex

jeśli mówisz o cpythonie… to tak, ale pypy jest w większości przypadków bardzo szybki (porównywalny z java, chyba 1/3 szybkości java), podzbiory Pythona są prawie tak szybkie jak c ++ (patrz shedskin)
Quonux

1
@JustinPeel mam pytanie, czy to prawda. nawet przy szerokim użyciu numpyi scipy, duża pythonbaza kodu prawdopodobnie będzie zawierała dużo kodu w czystym Pythonie, co będzie wolniejsze niż C++. skrypt w języku Python zbliża się do szybkości C++skryptu, gdy procent jego Ckodu osiąga 100, w którym to momencie nie jest już skryptem w języku Python. python na pewno startuje, ale nie dlatego, że jest tak szybki C++- ponieważ jest łatwiejszy w użyciu.
dbliss

131

Wszystkie najwolniejsze (> 100x) zastosowania Pythona podczas strzelaniny to operacje naukowe, które wymagają dużej liczby GFlop / s. W każdym razie NIE powinieneś używać do tego pythona. Prawidłowym sposobem korzystania z Pythona jest zaimportowanie modułu wykonującego te obliczenia, a następnie spędzenie relaksującego popołudnia z rodziną. To jest pytoniczny sposób :)


3
Obecnie istnieje kilka kompilatorów Python-to-C ++ , więc w niektórych przypadkach Python może być równie szybki jak C ++.
Anderson Green

26

Moje doświadczenie jest takie samo jak w przypadku testów porównawczych. Python może działać wolno i zużywa więcej pamięci. Piszę dużo, dużo mniej kodu i działa za pierwszym razem z dużo mniejszym debugowaniem. Ponieważ zarządza pamięcią za mnie, nie muszę zajmować się zarządzaniem pamięcią, oszczędzając godziny ścigania wycieków rdzenia.

Jakie jest Twoje pytanie?


Po prostu byłem zdezorientowany wynikami testów porównawczych. Okazuje się, że źle je zinterpretowałem.
Alex

16

Rozmiar źródła nie jest tak naprawdę rozsądną rzeczą do zmierzenia. Na przykład następujący skrypt powłoki:

cat foobar

jest znacznie krótszy niż jego odpowiedniki w Pythonie lub C ++.


35
O wiele łatwiej jest utrzymać to również w dłuższych wersjach Pythona lub C ++. Twierdzę, że rozmiar kodu źródłowego ma znaczenie, a do niektórych prostych zadań dobre są zwięzłe skrypty powłoki.
S.Lott

Uważam również, że rozmiar kodu źródłowego ma duże znaczenie, a do niektórych zadań Bash jest odpowiednim narzędziem do tego zadania. Zobacz fajny przykład porównujący prosty skrypt basha z pythonem tutaj: innolitics.com/articles/programming-languages/ ... (musisz trochę przewinąć w dół). Myślę, że jest to nieco bardziej wyrafinowany przykład niż cat footer.
jdg

7

Również: Psyco kontra C ++ .

To wciąż złe porównanie, ponieważ nikt i tak nie zrobiłby testów porównawczych, na których zwykle koncentrują się w czystym Pythonie. Lepszym rozwiązaniem byłoby porównanie wydajności realistycznych aplikacji lub C ++ z NumPy, aby zorientować się, czy program będzie zauważalnie wolniejszy.


2
innymi słowy - ponieważ numeryczne rzeczy są o wiele wolniejsze, napisz je w C ++ i wywołaj z Pythona :-)
igouy

1
Jeśli zamierzasz użyć biblioteki w Pythonie, aby przyspieszyć jej działanie, równie dobrze możesz użyć biblioteki do obliczania liczb w języku c ++. W ten sposób zachowujesz elastyczność c ++ bez konieczności pisania dużej ilości kodu :)
SuperSim135

Że to bóg-tier bezcelowe Necro. OP dosłownie stwierdza, że ​​preferuje Pythona ze względu na czytelność i wygodę, dlaczego ktoś miałby bezpośrednio używać języka, który lubi mniej, skoro większość korzyści związanych z wydajnością można uzyskać, zlecając autorom biblioteki zajęcie się nimi za niego? Celem korzystania z bibliotek jest to, że nie muszą wykonywać pracy, którą sami wykonują lepiej, ponieważ biblioteka jest natywnym powiązaniem jest szczegółem optymalizacji / implementacji.
millimoose

6

Problem polega na tym, że masz dwa różne języki, które rozwiązują dwa różne problemy ... przypomina porównywanie C ++ z asemblerem.

Python jest przeznaczony do szybkiego tworzenia aplikacji i tam, gdzie wydajność jest minimalna.

C ++ nie jest przeznaczony do szybkiego tworzenia aplikacji i dziedziczy dziedzictwo szybkości z języka C - do programowania niskopoziomowego.


3

To ten sam problem co zawsze z zarządzanym i łatwym w użyciu językiem programowania - są powolne (i czasami zżerają pamięć).

Są to języki, które należy kontrolować, a nie przetwarzać. Gdybym musiał napisać aplikację do przekształcania obrazów i musiałbym również używać Pythona, całe przetwarzanie mogłoby być napisane w C ++ i połączone z Pythonem za pomocą powiązań, podczas gdy interfejs i sterowanie procesem byłyby zdecydowanie Pythonem.


Te biblioteki są już napisane dla języka Python, C lub Java, więc dlaczego nie użyć dynamicznego języka, aby je skleić?
aoeu256,

2

Myślę, że te statystyki pokazują, że Python jest znacznie wolniejszy i zużywa więcej pamięci dla tych testów porównawczych - czy na pewno czytasz je we właściwy sposób?

Z mojego doświadczenia, które dotyczy głównie pisania programów związanych z siecią i systemem plików w Pythonie, Python nie jest znacząco wolniejszy pod żadnym względem. W przypadku tego rodzaju pracy korzyści przewyższają jej koszty.


W rzeczy samej. Kiedy problemem jest wydajność, to, w czym Python jest dobry, to łączenie ze sobą wysokowydajnych modułów zewnętrznych lub prototypowanie systemu, a następnie zezwalanie na przepisanie wąskich gardeł (zwykle głęboko w wewnętrznej pętli) na moduł C itp.
xan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.