Jak rozumiem, przyczyną różnicy prędkości między skompilowanymi językami a pythonem jest to, że pierwszy kompiluje kod aż do kodu natywnej maszyny, podczas gdy python kompiluje się do kodu bajtowego python, który ma być interpretowany przez PVM. Widzę, że w ten sposób kody Pythona mogą być używane na wielu systemach operacyjnych (przynajmniej w większości przypadków), ale nie rozumiem, dlaczego nie ma dodatkowego (i opcjonalnego) kompilatora dla Pythona, który kompiluje się w taki sam sposób jak tradycyjne kompilatory . Pozostawiłoby to programistom wybór, co jest dla nich ważniejsze; wykonywalność lub wydajność wieloplatformowa na maszynie macierzystej. Ogólnie; dlaczego nie ma języków, które można by traktować zarówno jako skompilowane, jak i interpretowane?
źródło
Odpowiedzi:
Nie. Powodem różnic prędkości między językami takimi jak Python i C ++ jest to, że języki o typie statycznym dają kompilatorowi mnóstwo informacji o strukturze programu i jego danych, co pozwala mu zoptymalizować obliczenia i dostęp do pamięci. Ponieważ C ++ wie, że zmienna jest typu int, może określić optymalny sposób manipulowania tą zmienną nawet przed uruchomieniem programu. Z drugiej strony w Pythonie środowisko wykonawcze nie wie, jaka wartość jest w zmiennej, dopóki interpreter nie osiągnie linii. Jest to niezwykle ważne w przypadku struktur, w których w C ++ kompilator może łatwo określić rozmiar struktury i każde położenie swoich pól w pamięci podczas kompilacji. Daje to ogromną moc przewidywania, w jaki sposób dane mogą zostać wykorzystane, i pozwala na optymalizację zgodnie z tymi przewidywaniami.
Aby skutecznie kompilować języki takie jak Python, musisz:
źródło
eval
i wiele innych rzeczy, aby zasmucić pisarzy kompilatorów. Nie jest na poziomie gcc, ale z pewnością jest szybszy niż interpreter CPython.Dwie koncepcje mogą pomóc nam lepiej zrozumieć, dlaczego Python skompilowany do natywnego kodu maszynowego „może” nie działać tak szybko, jak skompilowane C lub inne powszechnie kompilowane języki. Nazywa się je wczesnym wiązaniem i późnym wiązaniem.
Powinienem zacząć od stwierdzenia, że nie jestem ekspertem od Pythona i do tej witryny trafiłem przypadkiem. Ale podoba mi się ta strona.
Jak wspomniano w innej odpowiedzi tutaj, kompilator C ++ może dużo wiedzieć o programie i podejmować decyzje, których operacji użyć dla określonych struktur danych. Na przykład, jeśli należy dodać dwie zmienne całkowite, kompilator wie, że są to liczby całkowite natywne, na przykład o szerokości 32 bitów, i może je dodać razem z jedną instrukcją „DODAJ”. Więc kompiluje instrukcję ADD w kodzie. Jest zablokowany i nie można go zmienić podczas działania programu. To jest wczesne wiązanie.
Z drugiej strony w języku takim jak Python moglibyśmy oczekiwać, że program zrzuci różne typy danych w złożony sposób. Teraz kompilator nie wie, czy nasze 2 zmienne to liczby całkowite, zmiennoprzecinkowe, ciągi lub listy. Musi więc skompilować kod, który określa te informacje w czasie wykonywania i wybrać prawidłową operację podczas działania programu. To jest późne wiązanie i możemy zrozumieć, że wystąpi uderzenie w wydajności za wykonanie tej dodatkowej pracy podczas działania programu. Jest to cena, jaką płacisz za utrzymanie tych opcji w języku takim jak Python, ale zapewnia maksymalną elastyczność w czasie wykonywania.
źródło
Myślę, że ma to więcej wspólnego ze specyfiką Pythona, z tego samego powodu, dla którego nie można skompilować C # do kodu maszynowego. Specyfika języka sprawiłaby, że twoje programy byłyby wadliwe, nawet gdyby było to możliwe ze względu na naturę języka. Dlaczego nie po prostu nauczyć się języka C. Jest znacznie łatwiejszy niż C ++ i nieco zaawansowany niż Python, ale wciąż dostępny.
źródło