Welche semantischen Merkmale von Python (und anderen dynamischen Sprachen) tragen zu seiner Langsamkeit bei?
Keiner.
Die Leistung von Sprachimplementierungen hängt von Geld, Ressourcen und Doktorarbeiten ab, nicht von Sprachfunktionen. Self ist viel dynamischer als Smalltalk und etwas dynamischer als Python, Ruby, ECMAScript oder Lua, und es gab eine VM, die alle vorhandenen Lisp- und Smalltalk-VMs übertraf (tatsächlich wurde die Self-Distribution mit einem kleinen in Self geschriebenen Smalltalk-Interpreter ausgeliefert) , und selbst das war schneller als die meisten existierenden Smalltalk-VMs) und war konkurrenzfähig mit und manchmal sogar schneller als die damaligen C ++ - Implementierungen.
Dann hörte Sun auf, Self zu finanzieren, und IBM, Microsoft, Intel und Co. begannen, C ++ zu finanzieren, und der Trend kehrte sich um. Die Self-Entwickler verließen Sun, um ein eigenes Unternehmen zu gründen, in dem sie die für die Self-VM entwickelte Technologie verwendeten, um eine der schnellsten Smalltalk-VMs aller Zeiten (die animorphe VM) zu erstellen. Anschließend kaufte Sun das Unternehmen und eine leicht modifizierte Version von zurück Diese Smalltalk-VM ist jetzt besser unter dem Namen "HotSpot JVM" bekannt. Ironischerweise sehen Java-Programmierer dynamische Sprachen als "langsam" an, tatsächlich als Javawar langsam, bis es dynamische Sprachtechnologie annahm. (Ja, das ist richtig: Die HotSpot-JVM ist im Wesentlichen eine Smalltalk-VM. Der Bytecode-Prüfer führt viele Typprüfungen durch, aber sobald der Bytecode vom Prüfer akzeptiert wird, tun dies die VM und insbesondere der Optimierer und der JIT nicht mehr viel interesse bei den statischen typen!)
CPython erledigt einfach nicht viele Dinge, die dynamische Sprachen (oder eher den dynamischen Versand) schnell machen: dynamische Kompilierung (JIT), dynamische Optimierung, spekulatives Inlining, adaptive Optimierung, dynamische Deoptimierung, dynamisches Typ-Feedback / Inferenz. Es gibt auch das Problem, dass fast die gesamte Kern- und Standardbibliothek in C geschrieben ist, was bedeutet, dass Python, selbst wenn Sie es plötzlich 100x schneller machen, nicht viel hilft, weil so etwas wie 95% des Codes von a ausgeführt wird Python-Programm ist C, nicht Python. Wenn alles in Python geschrieben wäre, würden selbst moderate Beschleunigungen einen Lawineneffekt hervorrufen, bei dem die Algorithmen schneller und die Kerndatenstrukturen schneller werden, aber natürlich werden die Kerndatenstrukturen auch in den Algorithmen und den Kernalgorithmen und Kerndaten verwendet Strukturen werden überall sonst verwendet,
Es gibt einige Dinge, die für speicherverwaltete OO-Sprachen (dynamisch oder nicht) in heutigen Systemen notorisch schlecht sind. Virtueller Speicher und Speicherschutz können die Leistung der Speicherbereinigung und die Systemleistung im Allgemeinen beeinträchtigen. Und in einer speichersicheren Sprache ist das völlig unnötig: Warum vor illegalen Speicherzugriffen schützen, wenn es in der Sprache zunächst keine Speicherzugriffe gibt? Azul hat heraus modernen leistungsfähigen MMU (Intel Nehalem und neuere und äquivalente AMD) zu verwenden , um Hilfe Garbage Collection , anstatt es zu behindern, sondern auch wenn es von der CPU unterstützt wird, sind die aktuellen Speichersubsysteme von Mainstream - O nicht stark genug um dies zu ermöglichen (die eigentlich warum Azul ist JVM auf das blanke Metall virtualisiert läuft neben das Betriebssystem, nicht in ihm).
Im Projekt Singularity OS hat Microsoft eine Auswirkung von ~ 30% auf die Systemleistung gemessen, wenn der MMU-Schutz anstelle des Typsystems für die Prozesstrennung verwendet wurde.
Eine andere Sache, die Azul beim Aufbau seiner spezialisierten Java-CPUs bemerkte, war, dass moderne Mainstream-CPUs sich auf das völlig Falsche konzentrieren, wenn sie versuchen, die Kosten von Cache-Fehlern zu senken: Sie versuchen, die Anzahl von Cache-Fehlern durch Dinge wie Verzweigungsvorhersage, Speicher-Prefetching, und so weiter. In einem stark polymorphen OO-Programm sind die Zugriffsmuster jedoch grundsätzlich pseudozufällig, es ist einfach nichts vorherzusagen. Alle diese Transistoren sind also einfach verschwendet, und stattdessen sollten die Kosten für jeden einzelnen Cache-Fehler gesenkt werden. (Die Gesamtkosten betragen #misses * cost, der Mainstream versucht, den ersten Fehler zu beheben, Azul den zweiten.) Die Java-Compute-Beschleuniger von Azul könnten im Flug 20000 gleichzeitige Cache-Fehler aufweisen und dennoch Fortschritte erzielen.
Wenn Azul begonnen, sie dachten , sie würden einige nehmen off-the-shelf - I / O - Komponenten und entwerfen ihre eigenen spezialisierten CPU - Kern, aber was sie eigentlich am Ende , um zu tun war das genaue Gegenteil: sie haben eine ziemlich Standard - off-the Regal 3-Adressen-RISC-Kern und entwarf ihren eigenen Speichercontroller, MMU und Cache-Subsystem.
tl; dr : Die "Langsamkeit" von Python ist keine Eigenschaft der Sprache, sondern a) ihre naive (primäre) Implementierung und b) die Tatsache, dass moderne CPUs und Betriebssysteme speziell dafür ausgelegt sind, C schnell laufen zu lassen, und die Funktionen, die sie bieten Habe für C entweder nicht geholfen (Cache) oder sogar die Python-Performance aktiv beeinträchtigt (virtueller Speicher).
Und Sie können hier so ziemlich jede speicherverwaltete Sprache mit dynamischem Ad-hoc-Polymorphismus einfügen. Wenn es um die Herausforderungen einer effizienten Implementierung geht, sind sogar Python und Java so ziemlich "dieselbe Sprache".