Innanzitutto, alcuni chiarimenti: Python è una lingua. Esistono diversi interpreti che possono eseguire il codice scritto nel linguaggio Python. L'implementazione di riferimento (CPython) è di solito ciò a cui viene fatto riferimento quando qualcuno parla di "Python" come se fosse un'implementazione, ma è importante essere precisi quando si parla di caratteristiche delle prestazioni, poiché possono differire selvaggiamente tra implementazioni.
Come e dove possiamo abbracciare l'SRP senza compromettere le prestazioni in Python, poiché la sua implementazione intrinseca lo influenza direttamente?
Caso 1.)
Se hai un codice Python puro (<= Python Language versione 3.5, 3.6 ha "supporto di livello beta") che si basa solo su moduli Python puri, puoi abbracciare SRP ovunque e usare PyPy per eseguirlo. PyPy ( https://morepypy.blogspot.com/2019/03/pypy-v71-released-now-uses-utf-8.html ) è un interprete Python che ha un compilatore Just in Time (JIT) e può rimuovere la funzione chiamare overhead fintanto che ha il tempo sufficiente per "riscaldarsi" tracciando il codice eseguito (pochi secondi IIRC). **
Se si è limitati a utilizzare l'interprete CPython, è possibile estrarre le funzioni lente in estensioni scritte in C, che saranno precompilate e non subiranno alcun sovraccarico di interprete. Puoi comunque utilizzare SRP ovunque, ma il tuo codice verrà suddiviso tra Python e C. Se questo è meglio o peggio per manutenibilità rispetto all'abbandono selettivo di SRP ma attenersi al solo codice Python dipende dal tuo team, ma se hai sezioni critiche in termini di prestazioni del tuo codice, sarà indubbiamente più veloce del codice Python puro più ottimizzato interpretato da CPython. Molte delle più veloci librerie matematiche di Python usano questo metodo (numpy e scipy IIRC). Che è un bel seguito nel caso 2 ...
Caso 2.)
Se si dispone di codice Python che utilizza estensioni C (o si basa su librerie che utilizzano estensioni C), PyPy potrebbe essere utile o meno a seconda della modalità di scrittura. Vedi http://doc.pypy.org/it/latest/extending.html per i dettagli, ma il sommario è che CFFI ha un sovraccarico minimo mentre CTypes è più lento (usarlo con PyPy potrebbe essere anche più lento di CPython)
Cython ( https://cython.org/ ) è un'altra opzione con cui non ho molta esperienza. Lo cito per completezza, quindi la mia risposta può "essere autonoma", ma non rivendicare alcuna competenza. Dal mio uso limitato, mi è sembrato di dover lavorare di più per ottenere gli stessi miglioramenti di velocità che avrei potuto ottenere "gratuitamente" con PyPy, e se avessi bisogno di qualcosa di meglio di PyPy, sarebbe stato altrettanto facile scrivere la mia estensione C ( che ha il vantaggio se riutilizzo il codice altrove o ne estraggo parte in una libreria, tutto il mio codice può ancora essere eseguito con qualsiasi interprete Python e non è richiesto che sia eseguito da Cython).
Ho paura di essere "bloccato in" Cython, mentre qualsiasi codice scritto per PyPy può funzionare anche con CPython.
** Alcune note extra su PyPy in Production
Fai molta attenzione a fare qualsiasi scelta che abbia l'effetto pratico di "bloccarti" su PyPy in una base di codice di grandi dimensioni. Poiché alcune librerie di terze parti (molto popolari e utili) non funzionano bene per i motivi menzionati in precedenza, può causare decisioni molto difficili in seguito se ti rendi conto che hai bisogno di una di quelle librerie. La mia esperienza è principalmente nell'uso di PyPy per accelerare alcuni (ma non tutti) microservizi sensibili alle prestazioni in un ambiente aziendale in cui si aggiunge una complessità trascurabile al nostro ambiente di produzione (abbiamo già implementato più lingue, alcune con diverse versioni principali come 2.7 vs 3.5 esecuzione comunque).
Ho scoperto che l'uso di PyPy e CPython mi costringeva regolarmente a scrivere codice che si basa solo sulle garanzie fornite dalle specifiche del linguaggio stesso e non sui dettagli di implementazione che sono soggetti a modifiche in qualsiasi momento. Potresti trovare che pensare a tali dettagli sia un onere in più, ma l'ho trovato prezioso nel mio sviluppo professionale e penso che sia "salutare" per l'ecosistema Python nel suo insieme.