Zunächst einige Erläuterungen: Python ist eine Sprache. Es gibt verschiedene Interpreter, die in der Python-Sprache geschriebenen Code ausführen können. Auf die Referenzimplementierung (CPython) wird normalerweise verwiesen, wenn von "Python" die Rede ist, als ob es sich um eine Implementierung handelt. Es ist jedoch wichtig, genau zu sein, wenn es um Leistungsmerkmale geht, da sie sich zwischen den Implementierungen stark unterscheiden können.
Wie und wo setzen wir die SRP ein, ohne die Leistung in Python zu beeinträchtigen, da sich ihre inhärente Implementierung direkt auf sie auswirkt?
Fall 1.)
Wenn Sie reinen Python-Code haben (<= Python Language Version 3.5, 3.6 unterstützt Beta-Level), der nur auf reinen Python-Modulen basiert, können Sie SRP überall verwenden und PyPy zum Ausführen verwenden. PyPy ( https://morepypy.blogspot.com/2019/03/pypy-v71-released-now-uses-utf-8.html ) ist ein Python-Interpreter, der über einen Just-in-Time-Compiler (JIT) verfügt und Funktionen entfernen kann Rufen Sie den Overhead auf, solange er genügend Zeit zum "Aufwärmen" hat, indem Sie den ausgeführten Code verfolgen (einige Sekunden IIRC). **
Wenn Sie nur den CPython-Interpreter verwenden dürfen, können Sie die langsamen Funktionen in in C geschriebene Erweiterungen extrahieren, die vorkompiliert werden und keinen Interpreter-Overhead verursachen. Sie können SRP immer noch überall verwenden, aber Ihr Code wird zwischen Python und C aufgeteilt. Ob dies für die Wartbarkeit besser oder schlechter ist, als wenn Sie SRP selektiv aufgeben, sich aber nur an Python-Code halten, hängt von Ihrem Team ab, aber ob Sie leistungskritische Bereiche haben Code ist zweifellos schneller als selbst der optimierteste reine Python-Code, der von CPython interpretiert wird. Viele der schnellsten mathematischen Bibliotheken von Python verwenden diese Methode (numpy und scipy IIRC). Welches ist ein schöner Einstieg in Fall 2 ...
Fall 2.)
Wenn Sie Python-Code haben, der C-Erweiterungen verwendet (oder sich auf Bibliotheken stützt, die C-Erweiterungen verwenden), ist PyPy möglicherweise nützlich oder nicht, je nachdem, wie sie geschrieben wurden. Siehe http://doc.pypy.org/en/latest/extending.html Informationen finden Die Zusammenfassung lautet jedoch, dass CFFI nur einen minimalen Overhead hat, während CTypes langsamer ist (die Verwendung mit PyPy ist möglicherweise sogar langsamer als CPython).
Cython ( https://cython.org/ ) ist eine weitere Option, mit der ich nicht so viel Erfahrung habe. Ich erwähne es der Vollständigkeit halber, damit meine Antwort "für sich" stehen kann, beanspruche aber kein Fachwissen. Aufgrund meiner eingeschränkten Nutzung hatte ich das Gefühl, dass ich mich mehr anstrengen musste, um die gleichen Geschwindigkeitsverbesserungen zu erzielen, die ich mit PyPy "kostenlos" erreichen konnte, und wenn ich etwas Besseres als PyPy brauchte, war es genauso einfach, meine eigene C-Erweiterung zu schreiben ( Das hat den Vorteil, wenn ich den Code an einer anderen Stelle wiederverwende oder einen Teil davon in eine Bibliothek extrahiere. Mein gesamter Code kann weiterhin unter jedem Python-Interpreter ausgeführt werden und muss nicht von Cython ausgeführt werden.
Ich habe Angst davor, in Cython "eingesperrt" zu sein, während jeder für PyPy geschriebene Code auch unter CPython laufen kann.
** Einige zusätzliche Hinweise zu PyPy in der Produktion
Seien Sie sehr vorsichtig, wenn Sie Entscheidungen treffen, die den praktischen Effekt haben, dass Sie sich in PyPy in einer großen Codebasis "einschließen". Da einige (sehr beliebte und nützliche) Bibliotheken von Drittanbietern aus den oben genannten Gründen nicht gut funktionieren, kann es später zu sehr schwierigen Entscheidungen kommen, wenn Sie feststellen, dass Sie eine dieser Bibliotheken benötigen. Meine Erfahrung besteht hauptsächlich darin, mit PyPy einige (aber nicht alle) Mikrodienste zu beschleunigen, die in einer Unternehmensumgebung, in der die Komplexität unserer Produktionsumgebung vernachlässigbar ist, leistungsabhängig sind (wir haben bereits mehrere Sprachen implementiert, einige mit unterschiedlichen Hauptversionen wie 2.7 vs 3.5 läuft sowieso).
Ich habe festgestellt, dass sowohl PyPy als auch CPython mich regelmäßig gezwungen haben, Code zu schreiben, der sich nur auf Garantien stützt, die von der Sprachspezifikation selbst gegeben wurden, und nicht auf Implementierungsdetails, die jederzeit geändert werden können. Möglicherweise stellt das Nachdenken über solche Details eine zusätzliche Belastung dar, aber ich fand es in meiner beruflichen Entwicklung wertvoll und finde es "gesund" für das gesamte Python-Ökosystem.