По-перше, кілька уточнень: Python - це мова. Існує кілька різних перекладачів, які можуть виконувати код, написаний мовою Python. Референтна реалізація (CPython) - це зазвичай те, на що посилається, коли хтось говорить про "Python", як ніби це реалізація, але важливо бути точним, коли говорити про характеристики продуктивності, оскільки вони можуть різко відрізнятися між реалізаціями.
Як і де ми можемо сприйняти SRP, не порушуючи ефективність роботи в Python, оскільки його притаманна реалізація безпосередньо впливає на нього?
Випадок 1.)
Якщо у вас чистий код Python (<= мова Python версії 3.5, 3.6 має "підтримку бета-рівня"), який покладається лише на чисті модулі Python, ви можете охопити SRP скрізь і використовувати PyPy для його запуску. PyPy ( https://morepypy.blogspot.com/2019/03/pypy-v71-released-now-uses-utf-8.html ) - інтерпретатор Python, який має компілятор Just in Time (JIT) і може видалити функцію виклик накладних витрат до тих пір, поки у нього є достатній час для «прогрівання», відстежуючи виконаний код (кілька секунд IIRC). **
Якщо ви обмежені у використанні інтерпретатора CPython, ви можете витягнути повільні функції в розширення, написані на C, які будуть попередньо складені і не страждатимуть від будь-яких накладних інтерпретаторів. Ви все ще можете використовувати SRP скрізь, але ваш код буде розділений між Python та C. Чи краще це чи гірше для ремонту, ніж вибіркове відмовлення від SRP, але дотримання лише коду Python, залежить від вашої команди, але якщо у вас є критичні показники продуктивності вашої коду, це, безумовно, буде швидше, ніж навіть найбільш оптимізований чистий код Python, інтерпретований CPython. Багато хто з найшвидших математичних бібліотек Python використовують цей метод (numpy та scipy IIRC). Що є приємним описом у справі 2 ...
Випадок 2.)
Якщо у вас є код Python, який використовує розширення C (або покладається на бібліотеки, які використовують розширення C), PyPy може бути або не корисним залежно від того, як вони написані. Докладні відомості див. На веб-сторінці http://doc.pypy.org/en/latest/extending.html , але підсумок полягає в тому, що CFFI має мінімальні накладні витрати, тоді як CType повільніші (використання його з PyPy може бути навіть повільніше, ніж CPython)
Cython ( https://cython.org/ ) - це ще один варіант, з яким у мене не так багато досвіду. Я згадую це заради повноти, щоб моя відповідь могла "стояти самостійно", але не вимагати жодної експертизи. З мого обмеженого використання здавалося, що мені довелося більше працювати, щоб отримати ті ж покращення швидкості, що я можу отримати "безкоштовно" з PyPy, і якщо мені потрібно щось краще, ніж PyPy, було так само просто написати своє власне розширення C ( що має перевагу, якщо я повторно використовую код в іншому місці або витягаю його частину в бібліотеку, весь мій код все ще може працювати під будь-яким інтерпретатором Python і його не потрібно запускати Cython).
Мені страшно бути "замкненим" у Cython, тоді як будь-який код, написаний для PyPy, може працювати і під CPython.
** Деякі додаткові замітки про PyPy у виробництві
Будьте дуже обережні, щоб робити будь-які рішення, які мають практичний ефект "заблокувати вас" в PyPy у великій кодовій базі. Оскільки деякі (дуже популярні та корисні) сторонні бібліотеки не грають добре з причин, зазначених раніше, це може спричинити дуже важкі рішення пізніше, якщо ви зрозумієте, що вам потрібна одна з цих бібліотек. Мій досвід полягає насамперед у використанні PyPy для прискорення деяких (але не всіх) мікросервісів, які чутливі до продуктивності в середовищі компанії, де це додає незначної складності нашому виробничому середовищу (у нас уже розроблено кілька мов, деякі з різними основними версіями, як 2.7 проти 3.5 працює в будь-якому випадку).
Я виявив, що використання PyPy та CPython регулярно змушують мене писати код, який покладається лише на гарантії, надані самою мовною специфікацією, а не на деталі реалізації, які можуть змінюватися в будь-який час. Ви можете думати про такі деталі як додатковий тягар, але я вважаю це цінним у своєму професійному розвитку, і я думаю, що це "здорово" для екосистеми Python в цілому.