Czy programowanie w Pythonie jest szybsze niż w C, C ++ czy Java? [Zamknięte]


27

Istnieje powszechne przekonanie wśród , że bardziej dynamiczne i luźno wpisywanych języka, tym bardziej produktywne programista będzie w nim. Guido van Rossum napisał o programowaniu produktywności za pomocą Pythona w 1998 roku i podczas wyszukiwania w Internecie wciąż widzę osoby odwołujące się do tego konkretnego twierdzenia:

Składniowo kod Pythona wygląda jak wykonywalny pseudo kod. Programowanie przy użyciu Pythona jest 5-10 razy szybsze niż przy użyciu C / C ++ i 3-5 razy szybsze niż przy użyciu Java. W wielu przypadkach prototyp aplikacji można napisać w języku Python bez pisania kodu C / C ++ / Java. Często prototyp jest wystarczająco funkcjonalny i działa wystarczająco dobrze, aby zostać dostarczony jako produkt końcowy, co pozwala zaoszczędzić znaczny czas rozwoju. Innym razem prototyp można przetłumaczyć w części lub w całości na C ++ lub Java - obiektowa natura Pythona sprawia, że ​​tłumaczenie jest prostym procesem.

Czy ten problem został właściwie naukowo oceniony? Jeśli nie dla to może dla rodzeństwa języków skryptowych, takich jak , lub ?

Nie szukam racjonalizacji, analogii ani wyjaśnień, dlaczego odpowiedź na pytanie może być trudna, chyba że opinia naukowców lub ekspertów poświęciła czas na przyjrzenie się temu zagadnieniu.

Początkowo zadałem to pytanie na stronie sceptics.SE , a ktoś zasugerował, że powinienem zadać to pytanie tutaj.


25
Cóż, skoro ograniczyłeś zestaw możliwych odpowiedzi, odważę się na komentarz, zadając kolejne pytanie, na które należy najpierw odpowiedzieć (imho): Czy istnieją wiarygodne i sprawdzone wskaźniki do pomiaru „produktywności programisty”?
Paul Michalik,

1
@Paul Michalik - Zakładam, że każdy dokument badawczy, który dotyczyłby produktywności, zawierałby definicję (w przeciwnym razie byłoby to naprawdę trudne do zmierzenia). Więc jeśli ktoś odniósł się do badań, pomocne byłoby włączenie definicji do odpowiedzi. Prawdopodobnie istnieje (jak sądzę) kilka różnych całkowicie akceptowalnych sposobów pomiaru produktywności, być może „Czas potrzebny na pokonanie szeregu najbardziej niestosownych” byłby jednym z nich.
Kit Sunde

1
@Paul Michalik - Jasne, ale ile stwierdzeń, które czytasz w książkach, blogach, rozmowach i artykułach od programistów, jest faktycznie testowanych empirycznie? Jestem pewien, że istnieją lepsze lub gorsze sposoby pomiaru wydajności. Na przykład. „Spożycie kawy / czas” byłoby prawdopodobnie gorsze niż nawet klasyczne „Linie kodu / czasu”. Chciałbym powstrzymać się od oceny konkretnych stwierdzeń dotyczących wydajności, które widzieliśmy, i mogę na tej podstawie argumentować zasadność. Twierdzenia o produktywności również nie są po prostu błędne, jestem pewien, że „linie kodu / czasu” mierzą coś, gdy ludzie nie próbują zniszczyć metryki.
Kit Sunde

1
Możesz być zainteresowany w tym artykule: citeseerx.ist.psu.edu/viewdoc/...
DistantEcho

1
@ChrisF - Czy mówisz, że to pytanie nie dotyczy Programmers.SE? Z pewnością jest to dla sceptyków i tutaj też się do tego pasuje. Byłem pod wrażeniem, że nie należy aż Czytałem niedawno komentarz przez Roberta Cartaino na to pytanie: skeptics.stackexchange.com/q/1963/631 który zasadniczo mówi, że jest to całkowicie w porządku, jeśli jest to w interesie obu społeczności i Zrobiłem to dopiero po otrzymaniu monitu od innego użytkownika. Biorąc pod uwagę, że pytanie zyskuje przychylność, wydaje się, że jest to również przedmiotem zainteresowania tej społeczności.
Kit Sunde

Odpowiedzi:


17

Artykuł 1 Ousterhout na temat języków skryptowych sugeruje, że im wyższy poziom programowania, tym bardziej produktywny jest programista. Jeśli weźmiemy to, jak mówi Boehm 2 , liczba linii, które programista może napisać w danym czasie, jest stała i nie zależy od języka lub jego typu (niski poziom, programowanie systemu, skryptowanie), łatwo można uwierzyć w to twierdzenie. Wynikowe instrukcje-według-kodu-kodu-linii-wiersza mogą być o rząd wielkości (lub kilka) lepsze w przypadku języków skryptowych niż w językach programowania systemowego.

Ponieważ języki skryptowe w dużej mierze polegają na gotowych narzędziach do typowych zadań (np. Struktur danych, manipulacji ciągami), ich głównym zastosowaniem jest zwykle zwiększenie produktywności przy koszcie niższej prędkości działania poprzez dostarczenie składni, która jest łatwa do nauczenia i wydajna w utrzymaniu programów z. Nie trzeba używać języka skryptowego, gdy potrzebna jest najwyższa szybkość wykonywania.

[1]: JK Ousterhout, Skrypty: Programowanie wyższego poziomu w 21 wieku , komputer (IEEE), 1998
[2]: B. Boehm, Software Engineering Economics , Prentice Hall, 1981


9
Chociaż jest to dobra odpowiedź, nie zapominaj, że współczesne języki nieskryptowe są również wyposażone w gotowe narzędzia, które przyspieszają programowanie. C # przychodzi mi na myśl. Każdy, kto uważa, że ​​Python jest wyposażony w więcej gotowych narzędzi niż C #, po prostu znał Python lepiej niż C #. W rzeczywistości oba mają szeroki i porównywalny zakres „wbudowanych” narzędzi.
Roman Starkov

@romkyns, dla każdego nietrywialnego projektu musisz napisać dużo kodu. Nawet jeśli masz dużo klocków Lego, Bionicles nie magicznie się łączą.

2
@Thor, ale naprawdę lepiej jest mieć te klocki Lego z góry, zamiast najpierw zbudować wiertarkę do oleju, fabrykę plastiku i wytłaczarkę klocków Lego.
Roman Starkov,

2
Zarówno c ++, jak i Java mają ogólne kontenery, a c ++ 11 ma tak pełną standardową bibliotekę dla algorytmów sortowania i iteratorów itp. Nie jestem przekonany, że ktoś programujący Pythona miałby znaczną przewagę. Ponadto spędzam większość czasu na programowaniu na tym, co muszę zrobić, a nie na pisaniu. Myślę więc, że samo zliczenie liczby linii potrzebnych do zrobienia czegoś nie jest wyraźnym wskaźnikiem tego, jak szybko programista byłby w tym języku.
Sam Redway,

7

Jeśli mierzysz produktywność jako „czas na napisanie konkretnego prostego programu”, to zależy to bardziej od doświadczenia programisty i szybkiego myślenia niż od języka, który naprawdę oceniasz programistę, a nie języka.

Uważam, że konkursy kodu czasowego wskazują, że język nie ma tak naprawdę znaczenia dla tego rodzaju zadań. Nie ma jednego języka, który wygrywa takie wyzwania łatwiej niż inne (przynajmniej jeśli nie pozwalasz na względną popularność języków).

Jeśli mierzysz wydajność jako „skuteczność najlepszego programu” napisanego w danym języku, jest to jeszcze mniej zależne od języka. Zobacz na przykład wyniki konkursu Galcon AI . Zwycięzca jest napisany w Lisp. Następny wpis Lisp zajmuje jednak # 280. Co to mówi nam o przydatności języka do skutecznego pisania doskonałej sztucznej inteligencji? Moim zdaniem nic. Mówi nam tylko, że „bocsimacko” wymyślił i zaimplementował najskuteczniejsze algorytmy. Dla przypomnienia, czas nie był głównym czynnikiem w tym konkursie - ludzie mieli ponad dwa miesiące na opracowanie swojego kodu.

Wreszcie, jeśli mierzysz wydajność jako „długoterminowy koszt utrzymania projektu”, to myślę, że coś ci się podoba. Zwłaszcza, jeśli zatrudnisz do pracy tylko najlepszych ludzi i liczysz koszty w roboczogodzinach, a nie w dolarach. Mam silną opinię na temat tego, które języki są najlepsze do tego, ale nie mając żadnych twardych dowodów, które mogłyby cię z tym powiązać, pomijam tę opinię. Być może ktoś inny ma linki do tego typu wydajności.


7
„naprawdę oceniasz programistę, a nie język” - nie, jeśli jest to faktycznie zrobione naukowo. Weź 100 programistów. Wybierz ogólny projekt, taki jak „Napisz aplikację kalendarza z tymi konkretnymi wymaganiami”. Wymagania związane z automatycznymi testami jednostkowymi. 50 programistów pisze aplikację w C ++, 50 w Pythonie, wybieranych losowo, dzięki czemu programiści jakości są równi. Wynikiem byłby wynik łączący średni czas do ukończenia z liczbą pozytywnych testów jednostkowych. Porównaj średnią wyników Pythona ze średnią wyniku C ++ i ... NAUKA!
Morgan Herlocker

2
@Prof Być może jeśli dostaniesz tysiąc każdego ... ale nadal, w jaki sposób kontrolujesz fakt, że tylko ludzie o pewnym sposobie myślenia i pewnym poziomie umiejętności będą znać C ++?
Roman Starkov

możesz sprawić, że twoja próbka będzie pobierana tylko od osób, które zdadzą test biegłości w C ++ i Python. Wielu moich starych profesorów prowadzi bardzo podobne badania.
Robisz

6

http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf to jedno z niewielu badań, o których wiem, że faktycznie dokonało bezpośredniego porównania wydajności w różnych językach. Jest stary, ale warto go przeczytać, jeśli uznasz go za interesujący. Porównanie ma wiele poważnych wad, o których artykuł jest bardzo szczery.

Ogólny wynik jest taki, że języki niskiego poziomu (np. C, C ++) zajmują więcej czasu na pisanie, mogą zajmować znacznie mniej pamięci i mogą działać znacznie szybciej. Ale z bardzo dużą zmiennością. Języki skryptowe wysokiego poziomu zwykle zajmują o połowę mniej czasu i mają mniej zmienne podejście. W początkowo zaskakującym stopniu istnieje oczywisty sposób na zrobienie czegoś w języku skryptowym.

Należy pamiętać, że wszystkie wartości wydajności dla Java powinny być pobierane z dużym ziarnem soli - papier został wyprodukowany w latach 90., zanim ludzie mieli duże doświadczenie z Javą, i zanim JVM została dobrze zoptymalizowana. Oba czynniki powinny mieć znaczący wpływ.


1

Mówiąc ogólnie, pisanie programu w Pythonie będzie zwykle szybsze niż pisanie tego samego programu w C, C ++, Java.

Prawdopodobnie będzie działać wolniej.

Istnieją oczywiście określone aplikacje, dla których inne języki mogą być szybsze, ponieważ niektóre zaangażowane zadania są obsługiwane „bardziej natywnie”.

Chociaż nie jestem świadomy żadnych badań potwierdzających ten wzrost prędkości / wydajności (jak wspomniał jeden z komentatorów, może to być trudne do precyzyjnego zmierzenia), przeprowadzono bezpośrednie badania nad ekspresją języka.

Myślę, że istnieje pewna zasługa korelacji między ekspresją języka a szybkością programowania. Wystarczy wyobrazić sobie prosty wzorzec iteracji i przedstawić bardziej zwięzłe rozumienie pętli for lub pętli w Pythonie. Nie tylko można go natychmiast pisać szybciej, ale także eliminuje obawy o błędy off-by-one, indeksy poza zakresem i inne podobne problemy, które mogą znacznie spowolnić proces kodowania.

Pokazuje tabelę szacunkową współczynnika ekspresyjności języków. Chociaż należy go przyjmować z odrobiną soli, wspomniane przypisy są bardzo opłacalne.

http://en.wikipedia.org/wiki/Comparison_of_programming_languages#Expressiveness


-5

Ostatnim razem, gdy korzystałem z Javy (co prawda, jakiś czas temu), otworzyłem ekran pełen kodu, aby otworzyć i zapisać plik. Porównaj to z kilkoma liniami w Pythonie lub Perlu i możesz zgadnąć, który z nich jest szybszy.

Oczywiście wszystkie języki mają swoje mocne i słabe strony, ale w przypadku większości zadań pisanie w języku Python będzie szybsze.


6
„otwarcie i zapisanie pliku wymagało ekranu pełnego kodu”: umieść to w klasie narzędzi za pomocą dwóch metod, write()a read()do pozostałej części pliku projektu Java dostęp będzie tak zwięzły jak w Pythonie. Myślę, że twój przykład jest nieco zbyt ograniczony, aby porównywać Pythona i Javę (chociaż zgadzam się, że Java jest bardziej gadatliwa).
Giorgio

Jasne, ale Python, Perl i wyższe języki na ogół o tym wcześniej myślały, więc nie musisz pisać klas narzędzi (lub ich nie tak wielu). Korzystanie z klasy narzędzi wciąż wymaga czasu i jest zasadą kodu wielokrotnego użytku, który stosuje się zarówno w Javie, jak i Pythonie, w zależności od tego, co faktycznie robisz.
wobbily_col,

Zakłada się, że Java potrzebuje 50 - 60 linii kodu, aby otworzyć i zapisać plik. To po prostu nie jest poprawne.
h22
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.