Wstęp
Cześć moje słonie kochane 🐘 i węże tuląco-jadowite 🐍. Nadszedł ten wiekopomny moment (do którego mnie zmusiliscie) do którego zostałem bardzo zachęcony, w którym napiszę o tym co jest lepsze: PHP czy Python?
Już na wstępie powiem, że żadne w powyższych, bo prawdziwy programista powinien umieć kontrolować wszystkimi napięciami, które powstają w komputerze tak, aby tym pisać m.in kod binarny, ale i też sterować każdym podzespołem. Wszystko inne to języki wyższych poziomów – tego pogrubionego fragmentu jak to coś nie brać na poważnie 😆
Więc… dzisiaj pomimo tego, że coś tutaj ukażę to niekoniecznie będzie to świadczyć o tym, który z tych języków będzie lepszy. Języki programowania są tylko różnymi narzędziami i bardzo łatwo je porównać do śrubokrętów, które powstały do konkretnych typów wkrętów (na internecie wpisać „typy śrubokrętów” to świadomość wskoczy na wyższy lvl) albo do różnych typów klejów, bo są takie do kartek, a inne są do tapet (też różne rodzaje), a jeszcze inne kleje są do drewna itd. itd… No tak samo są różne naczynia.. dobra chyba nie muszę dalej porównywać czegoś nierealnego z realnymi przedmiotami 🤣
Przygotowanie
Aby cokolwiek móc przetestować, należy wymyślić jak coś przetestować i takie punktowe cusie, np. lista rzeczy do przetestowania, ma nam też coś powiedzieć i to nie jest wcale takie proste, zatem uznałem, że nie będę robić wyrafinowanych testów lecz przetestuję jakieś rzeczy, które w obu językach da się prosto utworzyć i uruchomić.
Mój test polegać będzie na pobraniu z jednego źródła danych (z pliku lokanego) dokumentu w formacie JSON, a następnie sprawdzić:
- Prędkość parsowania JSON na Obiekt
- Szybkość z jaką połączy się wszystkie elementy z tablicy za pomocą pętli i konkatenacji (nie będę korzystać ze specjalnych metod służących temu)
- Szybkości serializacji JSON do obiektu klasy DTO
- Tak jak 3. tylko że będę chciał uzyskać błąd i przetestować szybkość obsługi wyjątku
- Prędkość deserializacji z DTO na JSON i utworzeniu nowego pliku dokumentu JSON – z tego zrezygnowałem (wyjaśnię później)
Więc co nam to udowodni? Oprócz tego że będę mógł zdać relację pisania obu skryptów to i też poznamy prędkości.
Do testów użyję PHP 8.2 oraz Python3. Każdy punkt zrealizuję jako osobny plik, a całość wrzucę na GitHub, abyście mogli mój test powtórzyć no albo czegoś się nauczyć albo przerobić pod własne testy.
O pisaniu skryptów
W obu przypadkach googlowałem proste rzeczy, a jak to pobrać dane z pliku, a jak to przerobić na JSON, a jak to mierzyć czas wykonania kodu. No i tutaj generalnie w obu językach nie miałem aż tak większego problemu, aby cokolwiek znaleźć. Z Pythonem miałem problem taki, że kompletnie jego składni nie znam, a nawet myślałem, że skoro średników nie trzeba to tym bardziej jakiś dwukropków i „selfiaków” nie będę potrzebować, więc problemy były ze nieznajomością narzędzia. Z tego powodu musiałem zrezygnować całkowicie z piątego punktu testu.
Co do PHP, generalnie poza drobnymi zmianami w nazwach zmiennych to większość kodu była kopiuj wklej z internetu. Struktury w obu językach staram się zrobić identico (z drobnymi różnicami w składniach). Więc jak w PHP zrobiłem foreach to na internecie szukałem odpowiednika dla Pythona i znalazłem for in.
Bardzo ważne było też dla mnie to, aby skrypty w obu językach wyglądały bardzo podobnie, aby w łatwy sposób dało się porównać co z czym jak szybko działa. Pisanie kodu zacząłem wczoraj (20 list 2022) o godzinie około 20:00 co z PHP skończyłem o 20:30, co jak z Pythonem zacząłem koło 21:00 to skończyłem o 23:30 i powiedziałem, że to nie jest język na moje nerwy.
Porównanie
Jako iż jestem jeszcze przed analizą wyników na wstępie mogę powiedzieć co wydaje mi się, a wydaje mi się, że Python jest dużo wolniejszy od PHP no i tak, bo w PHP można przeiterować 5-cio-milionową elementów tablicy w miej niż sekundę używając tylko bardzo prosty foreach, co w Pythonie, aby takie samo zrobić wydajniej trzeba napisać jednak więcej kodu, ale bez kombinacji w kodzie jednak chciałem robić porównanie, no bo foreach i for in to dla mnie i pewnie dla wielu to samo i w założeniu działać ma tak samo.
Gdy miałem przygotowany 30 MB plik z danymi to PHP poradził sobie ze wszystkim, a Python drugiego punktu testu nie potrafił dokończyć w rozsądnym czasie. Tak w sumie przerwałem mu działanie po 2 minutach. PHP poradził sobie poniżej 1 sekundy (a dokładniej to w 0,199593… sek) tworząc zmienną ze 16968000 znakami.
No ale chciałem jednak dać szansę wężowi, aby nie było, że specjalnie na start go uwaliłem. No chociaż myślę, że język programowania, który jest tak długo „wspierany” i uznawany jest za język wysokiego poziomu powinien mieć w miarę dojrzałą formę foreach (nawet ten for in) tak, aby zawsze szybko to działało i już na tym etapie nasuwa mi się wniosek, że to nie jest język, w którym cele biznesowe da się osiągnąć stosując strukturę heksagonalną i wszelakich zasad programowania domenowego, i jeszcze aby to działało optymalnie. Zasada jest prosta: 20 mln itemów w tablicy i chcę je przeiterować. Dla mnie według zasady KISS powinienem był użyć tylko i wyłącznie foreach.
Zatem.. zmniejszyłem rozmiar pliku z danymi do około 300 KB (dużo dużo mniej) i dostałem następujące wyniki
Punkt testu | PHP | Python |
---|---|---|
1. Plik JSON do zmiennej | 0.0024709 s | 0.0182242 s |
2. Konkatenacja w pętli | 0.0015609 s | 0.0409214 s |
3. Serlializacja | 0.0000159 s | 0.0001060 s |
4. Obsługa wyjątku | 0.0000222 s | 0.0000834 s |
Wnioski
Trudno tutaj jednoznacznie powiedzieć że Python jest gorszy, bo mój test tego nie dowodzi. Raz że musiałbym ten język lepiej poznać to dwa w nim tak ja ja to zrobiłem nie pisze się. To co już jednak ustaliłem, że PHP działa jednak dużo szybciej niż zakładałem 😅 W wersji 5.4 takich czasów bym już nie uzyskał, więc widzę duży postęp w optymalizacji tego języka, co pewnie skłoni mnie do porównania prędkości pomiędzy wersjami, a co bardziej, bym miał kolejny powód do aktualizowania wszystkiego 😈
Jeśli chodzi o jakieś dalsze wnioski idące za zdobytymi przeze mnie cyferkami to zostawię wam moje misiaczki pole do popisu, bo może jest coś, co ja mogłem przeoczyć… na pewno jest 😆
Podsumowanie
Zatem poświęciłem dwa wieczory specjalnie pod ten pseudo-naukowy wyczyn, który zasadniczo mało co udowadnia. Za to mogłem ujrzeć wężowy odwłok odchodzący ku zachodzącemu słońcu na tle słoniowych chmur.. Czy straciłem czas?… 😬 Powiem tylko, że czas poświęconych dla moich kochanych misiaczków nigdy nie jest stracony 🫂
Wolę PHP
Także do następnego miłego 😘
Repozytorium: https://github.com/EnterVPL/PHPvsPython
Sam robisz te rysunki, czy są
kradzionepożyczone?😸
Tak jak napisałeś na początku. Różne języki do różnych zadań służą. Nie można oceniać ryby na podstawie tego czy dobrze lata. Swoją drogą ciekawy test. Ukazał on różnice czadowe przy prostych zadaniach.
Może gdy masz już dwa języki dodaj do niego kolejne. Przy takim samym założeniu. Proponuję dorzucić rodzinę „C” oraz mógłbym z czystej ciekawości podrzucić Tobie „GDScript”, aż sam jestem ciekaw jakie byłyby wyniki.
Bardzo ciekawa koncepcja. Będę musiał wymyślić jakieś inne nowe testy. No i to jakoś usystematyzować, aby też każdy mógł te testy po swojemu zrobić
[…] lekcji, którą wyciągnąłem podczas tworzenia poprzedniego porównania, dowiedziałem się, że testy muszą być jeszcze prostsze i bardziej uniwersalne i oto doszedłem […]