Это своего рода общий вопрос, связанный с конкретной реализацией, которую я имею в виду, о том, можно ли использовать подпрограммы python, предназначенные для использования внутри GIL в среде общей памяти. В частности, я хотел бы использовать scipy.optimize.curve_fit
на большом массиве внутри функции cython
.Использование scipy подпрограмм вне GIL
Данные могут быть выражены в виде массива 2d numpy
(скажем, поплавков) с осью, которая должна соответствовать друг другу, а другая - сериализованной осью, которая должна быть распараллелена. Тогда я просто хотел бы выпустить GIL и начать цикл с данными с cython.parallel.prange
(идея в том, что я могу иметь все мои ядра, работающие на установку сразу).
Основная проблема, которую я могу предвидеть, заключается в том, что curve_fit
не работает «на месте»; он возвращает значения соответствия параметров (и, возможно, их ковариационную матрицу) и поэтому должен выделять эту память в какой-то момент. (Конечно, я также не имею ни малейшего представления о промежуточном распределении памяти, которое выполняет подпрограмма.) Я беспокоюсь о том, как это будет действовать за пределами GIL, при этом многие потоки будут работать одновременно.
Я понимаю, что ответ может быть просто «он должен отлично работать, попробуйте», но я надеюсь получить некоторое представление о том, что нужно искать. Я также понимаю, что этот вопрос аналогичен другим вопросам о параллелизации подпрограмм scipy
/numpy
, но я думаю, что этот текст сформулирован по-другому в том, что относится к области cython
среды C для python.
Спасибо за любую помощь/предложения.
Некоторых скомпилирован '' numpy' и scipy' кода имеет кодовые блоки, отмеченные 'не gil' макроса. Я бы предложил изучить код 'curve_fit'. Это может быть сочетание питона и скомпилированного кода, возможно, даже вызов внешней библиотеки. – hpaulj
Чтобы добавить к комментарию @ hpaulj: если scipy-код вообще выпустит GIL, вы получите некоторую выгоду от параллельного цикла без необходимости выпускать GIL самостоятельно. _However_, если он возвращает объекты Python, будьте осторожны, так как получается, что Cython не делает их поточно-локальными. – DavidW
Еще один комментарий: 'curve_fit' скорее всего потратит большую часть своего времени на вызов функции, предоставляемой пользователем (что потребует GIL), поэтому выгоды, вероятно, будут небольшими – DavidW