Warum scheint Python im Durchschnitt langsamer als C / C ++? Ich habe Python als meine erste Programmiersprache gelernt, aber ich habe gerade erst mit C angefangen und habe bereits das Gefühl, einen deutlichen Unterschied zu erkennen.
Warum scheint Python im Durchschnitt langsamer als C / C ++? Ich habe Python als meine erste Programmiersprache gelernt, aber ich habe gerade erst mit C angefangen und habe bereits das Gefühl, einen deutlichen Unterschied zu erkennen.
Antworten:
Python ist eine höhere Sprache als C, dh es abstrahiert die Details des Computers von Ihnen - Speicherverwaltung, Zeiger usw. - und ermöglicht es Ihnen, Programme auf eine Weise zu schreiben, die dem menschlichen Denken näher kommt.
Es ist wahr, dass C-Code normalerweise 10 bis 100 Mal schneller ausgeführt wird als Python-Code, wenn Sie nur die Ausführungszeit messen. Wenn Sie jedoch auch die Entwicklungszeit einbeziehen, schlägt Python häufig C. Bei vielen Projekten ist die Entwicklungszeit weitaus kritischer als die Laufzeitleistung. Eine längere Entwicklungszeit führt direkt zu zusätzlichen Kosten, weniger Funktionen und einer langsameren Markteinführungszeit.
Intern wird Python-Code langsamer ausgeführt, weil der Code zur Laufzeit interpretiert wird, anstatt zur Kompilierungszeit zu nativem Code kompiliert zu werden.
Andere interpretierte Sprachen wie Java-Bytecode und .NET-Bytecode werden schneller ausgeführt als Python, da die Standarddistributionen einen JIT-Compiler enthalten , der zur Laufzeit Bytecode zu nativem Code kompiliert. Der Grund, warum CPython noch keinen JIT-Compiler hat, liegt darin, dass die Dynamik von Python das Schreiben eines solchen erschwert. Es gibt Arbeit in Fortschritt eine schnellere Python - Laufzeit zu schreiben , so dass Sie die Performance - Lücke in Zukunft reduziert werden erwarten sollten, aber es wird wahrscheinlich eine Weile dauern , bis die Standard - Python - Distribution einen leistungsstarken JIT - Compiler enthält.
CPython ist besonders langsam, da es kein Just-in-Time-Optimierungsprogramm gibt (da es sich um die Referenzimplementierung handelt und in bestimmten Fällen Einfachheit gegenüber Leistung wählt). Unladen Swallow ist ein Projekt zum Hinzufügen einer LLVM-gestützten JIT zu CPython und erzielt massive Beschleunigungen. Es ist möglich, dass Jython und IronPython viel schneller als CPython sind und von stark optimierten virtuellen Maschinen (JVM und .NET CLR) unterstützt werden.
Eine Sache, die Python jedoch wahrscheinlich langsamer machen wird, ist, dass es dynamisch typisiert wird und es für jeden Attributzugriff eine Menge Suche gibt.
Zum Beispiel führt das Aufrufen f
eines Objekts A
zu möglichen Suchvorgängen __dict__
, Aufrufen __getattr__
usw. und schließlich zum Aufrufen __call__
des aufrufbaren Objekts f
.
In Bezug auf die dynamische Typisierung gibt es viele Optimierungen, die durchgeführt werden können, wenn Sie wissen, mit welcher Art von Daten Sie es zu tun haben. Wenn Sie beispielsweise in Java oder C ein gerades Array von Ganzzahlen haben, die Sie summieren möchten, kann der Endassembler-Code so einfach sein, dass Sie den Wert am Index i
abrufen, zum Index hinzufügen accumulator
und dann inkrementieren i
.
In Python ist es sehr schwierig, Code so optimal zu machen. Angenommen, Sie haben ein Listenunterklassenobjekt, das int
s enthält. Bevor Python überhaupt etwas hinzufügt, muss es aufrufen list.__getitem__(i)
, dies dann durch Aufrufen zum "Akkumulator" hinzufügen und accumulator.__add__(n)
dann wiederholen. Hier können Tonnen von alternativen Suchvorgängen auftreten, weil ein anderer Thread beispielsweise die __getitem__
Methode, das Diktat der Listeninstanz oder das Diktat der Klasse zwischen Aufrufen zum Hinzufügen oder Abrufen geändert hat. Selbst das Auffinden des Akkumulators und der Liste (und aller von Ihnen verwendeten Variablen) im lokalen Namespace führt zu einer Diktatsuche. Der gleiche Aufwand gilt für die Verwendung eines benutzerdefinierten Objekts, obwohl er für einige integrierte Typen etwas geringer ist.
Es ist auch erwähnenswert, dass die primitiven Typen wie bigint (int in Python 3, long in Python 2.x), list, set, dict usw. usw. in Python häufig verwendet werden. Es gibt Tonnen von eingebauten Operationen an diesen Objekten, die bereits ausreichend optimiert sind. Im obigen Beispiel würden Sie beispielsweise nur aufrufen, sum(list)
anstatt einen Akkumulator und einen Index zu verwenden. Wenn Sie sich an diese halten und ein bisschen mit int / float / complex Zahlen knacken, werden Sie im Allgemeinen keine Geschwindigkeitsprobleme haben, und wenn Sie dies tun, gibt es wahrscheinlich eine kleine zeitkritische Einheit (zum Beispiel eine SHA2-Digest-Funktion), die Sie können Wechseln Sie einfach zu C (oder Java-Code in Jython). Tatsache ist, dass Sie beim Codieren von C oder C ++ viel verschwenden werdenZeit, Dinge zu tun, die Sie in wenigen Sekunden / Zeilen Python-Code tun können. Ich würde sagen, der Kompromiss lohnt sich immer, außer in Fällen, in denen Sie so etwas wie Embedded- oder Echtzeitprogrammierung durchführen und es sich nicht leisten können.
Kompilierung und Interpretation sind hier nicht wichtig: Python wird kompiliert und ist ein winziger Teil der Laufzeitkosten für jedes nicht triviale Programm.
Die Hauptkosten sind: das Fehlen eines Integer-Typs, der nativen Integers entspricht (wodurch alle Integer-Operationen erheblich teurer werden), das Fehlen einer statischen Typisierung (was die Auflösung von Methoden erschwert und bedeutet, dass die Wertetypen überprüft werden müssen zur Laufzeit) und das Fehlen von Werten ohne Box (die die Speichernutzung reduzieren und eine Indirektionsebene vermeiden können).
Nicht, dass eines dieser Dinge in Python nicht möglich ist oder nicht effizienter gestaltet werden kann, aber es wurde die Wahl getroffen, den Komfort und die Flexibilität des Programmierers sowie die Sprachbereinigung gegenüber der Laufzeitgeschwindigkeit zu bevorzugen. Einige dieser Kosten können durch eine clevere JIT-Kompilierung überwunden werden, aber die Vorteile, die Python bietet, sind immer mit Kosten verbunden.
Der Unterschied zwischen Python und C ist der übliche Unterschied zwischen einer interpretierten (Bytecode) und einer kompilierten (in die Muttersprache) Sprache. Persönlich sehe ich Python nicht so langsam, es schafft es ganz gut. Wenn Sie versuchen, es außerhalb seines Bereichs zu verwenden, wird es natürlich langsamer. Dafür können Sie jedoch C-Erweiterungen für Python schreiben, die zeitkritische Algorithmen in nativen Code einfügen und so viel schneller machen.
Abgesehen von den bereits veröffentlichten Antworten ist eine Sache die Fähigkeit von Python, Dinge zur Laufzeit zu ändern, die Sie beispielsweise nicht ändern können. Sie können Klassen währenddessen Elementfunktionen hinzufügen. Außerdem macht es die dynamische Natur von Pythons unmöglich zu sagen, welche Art von Parametern an eine Funktion übergeben wird, was wiederum die Optimierung erheblich erschwert.
RPython scheint eine Möglichkeit zu sein, das Optimierungsproblem zu umgehen .
Dennoch wird es wahrscheinlich nicht in der Nähe der Leistung von C für Zahlenverarbeitung und dergleichen sein.
Python wird normalerweise als Skriptsprache implementiert. Das bedeutet, dass es einen Interpreter durchläuft, was bedeutet, dass es Code im laufenden Betrieb in die Maschinensprache übersetzt, anstatt die ausführbare Datei von Anfang an vollständig in Maschinensprache zu haben. Infolgedessen muss es die Kosten für die Übersetzung von Code zusätzlich zur Ausführung bezahlen. Dies gilt auch für CPython, obwohl es zu Bytecode kompiliert wird, der näher an der Maschinensprache liegt und daher schneller übersetzt werden kann. Mit Python kommen auch einige sehr nützliche Laufzeitfunktionen wie die dynamische Typisierung, aber solche Dinge können normalerweise nicht einmal auf den effizientesten Implementierungen ohne hohe Laufzeitkosten implementiert werden.
Wenn Sie sehr prozessorintensive Arbeiten wie das Schreiben von Shadern ausführen, ist Python nicht selten etwa 200-mal langsamer als C ++. Wenn Sie CPython verwenden, kann diese Zeit halbiert werden, aber es ist noch lange nicht so schnell. Mit all diesen Kleinigkeiten ist ein Preis verbunden. Es gibt viele Benchmarks, die dies zeigen, und hier ist eine besonders gute. Wie auf der Titelseite zugegeben, sind die Benchmarks fehlerhaft. Sie werden alle von Benutzern eingereicht, die ihr Bestes geben, um effizienten Code in der Sprache ihrer Wahl zu schreiben, aber es gibt Ihnen eine gute allgemeine Vorstellung.
Ich empfehle Ihnen, beide zu mischen, wenn Sie sich Gedanken über Effizienz machen: Dann können Sie das Beste aus beiden Welten herausholen. Ich bin in erster Linie ein C ++ - Programmierer, aber ich denke, viele Leute neigen dazu, zu viel von dem alltäglichen Code auf hoher Ebene in C ++ zu codieren, wenn dies nur ein Ärgernis ist (Kompilierungszeiten als nur ein Beispiel). Das Mischen einer Skriptsprache mit einer effizienten Sprache wie C / C ++, die näher am Metall liegt, ist wirklich der richtige Weg, um die Effizienz (Produktivität) des Programmierers mit der Effizienz der Verarbeitung in Einklang zu bringen.
Der Vergleich von C / C ++ mit Python ist kein fairer Vergleich. Als würde man einen F1-Rennwagen mit einem Nutzfahrzeug vergleichen.
Überraschend ist, wie schnell Python im Vergleich zu anderen dynamischen Sprachen ist. Während die Methodik oft als fehlerhaft angesehen wird, sehen Sie sich das Computersprachen-Benchmark-Spiel an, um die relative Sprachgeschwindigkeit bei ähnlichen Algorithmen zu ermitteln.
Der Vergleich mit Perl, Ruby und C # ist fairer.
C und C ++ werden zu nativem Code kompiliert, dh sie werden direkt auf der CPU ausgeführt. Python ist eine interpretierte Sprache, was bedeutet, dass der von Ihnen geschriebene Python-Code viele, viele Abstraktionsstufen durchlaufen muss, bevor er zu ausführbarem Maschinencode werden kann.
Python wird interpretiert. Die Sprache wird nicht eingehalten und nicht mit der CPU-Hardware kombiniert
Aber ich habe eine Lösung, um Python als schnellere Programmiersprache zu erhöhen
1.Use python3 for run and code python command like Ubuntu or any Linux distro use python3 main.py and update regularly your python so you python3 framework modules and libraries i will suggest use pip 3.
2.Use [Numba][1] python framework with JIT compiler this framework use for data visualization but you can use for any program this framework use GPU acceleration of your program.
3.Use [Profiler optimizing][1] so this use for see with function or syntax for bit longer or faster also have use full to change syntax as a faster for python its very god and work full so this give a with function or syntax using much more time execution of code.
4.Use multi threading so making multiprocessing of program for python so use CPU cores and threads so this make your code much more faster.
5.Using C,C#,C++ increasing python much more faster i think its called parallel programing use like a [cpython][1] .
6.Debug your code for test your code to make not bug in your code so then you will get little bit your code faster also have one more thing Application logging is for debugging code.
and them some low things that makes your code faster:
1.Know the basic data structures for using good syntax use make best code.
2.make a best code have Reduce memory footprinting.
3.Use builtin functions and libraries.
4.Move calculations outside the loop.
5.keep your code base small.
Wenn Sie dieses Ding verwenden, erhalten Sie Ihren Code viel schneller. Ja, wenn Sie dieses Python verwenden, ist dies keine langsame Programmiersprache