Сначала некоторые уточнения: Python - это язык. Существует несколько различных интерпретаторов, которые могут выполнять код, написанный на языке Python. Ссылочная реализация (CPython) обычно является той, на которую ссылаются, когда кто-то говорит о «Python», как будто это реализация, но важно быть точным, говоря о характеристиках производительности, поскольку они могут сильно отличаться в разных реализациях.
Как и где мы можем использовать SRP без ущерба для производительности в Python, поскольку его внутренняя реализация напрямую влияет на него?
Случай 1.)
Если у вас есть чистый код Python (<= Python Language version 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 имеет минимальные издержки, тогда как CTypes медленнее (использование его с PyPy может быть даже медленнее, чем CPython)
Cython ( https://cython.org/ ) - еще один вариант, с которым у меня не так много опыта. Я упоминаю это для полноты картины, чтобы мой ответ мог «стоять сам по себе», но не требует какой-либо экспертизы. Из-за моего ограниченного использования я чувствовал, что мне пришлось работать усерднее, чтобы получить те же улучшения скорости, которые я мог получить «бесплатно» с PyPy, и если мне нужно что-то лучше, чем PyPy, было бы так же легко написать свое собственное расширение C ( что имеет преимущество, если я повторно использую код в другом месте или извлекаю его часть в библиотеку, весь мой код все еще может работать под любым интерпретатором Python и не должен запускаться Cython).
Я боюсь быть "заблокированным" в Cython, тогда как любой код, написанный для PyPy, также может работать под CPython.
** Некоторые дополнительные заметки о PyPy в производстве
Будьте очень осторожны при принятии любых решений, которые имеют практический эффект «привязки» к PyPy в большой кодовой базе. Поскольку некоторые (очень популярные и полезные) сторонние библиотеки не работают хорошо по причинам, упомянутым ранее, это может привести к очень трудным решениям позже, если вы поймете, что вам нужна одна из этих библиотек. Мой опыт в основном заключается в использовании PyPy для ускорения некоторых (но не всех) микросервисов, которые чувствительны к производительности в корпоративной среде, где это добавляет незначительную сложность в нашу производственную среду (у нас уже развернуто несколько языков, некоторые с разными основными версиями, такими как 2.7 против 3,5 работает в любом случае).
Я обнаружил, что использование PyPy и CPython регулярно заставляло меня писать код, который полагается только на гарантии, предоставляемые самой спецификацией языка, а не на детали реализации, которые могут быть изменены в любое время. Вы можете подумать о таких деталях как дополнительное бремя, но я нашел это ценным в своем профессиональном развитии, и я думаю, что это «полезно» для экосистемы Python в целом.