Как Numpy / Scipy превращает функции C в векторизованные функции Python? - PullRequest
0 голосов
/ 17 января 2019

Насколько я понимаю, векторизованные функции numpy работают быстрее, чем циклы Python, потому что циклы выполняются на C или Fortran. Я хотел бы знать, где в исходном коде это происходит.

Например, биномиальная функция CDF scipy.special.bdtr принимает аргументы, подобные массиву k,n,p, и возвращает ndarray, если аргументы являются транслируемыми. В документации говорится, что scipy.special.bdtr - это оболочка для подпрограммы в библиотеке математических функций Cephes. Копаясь в исходном коде на Github, я нашел файл scipy/special/cephes/bdtr.c, содержащий код C для этой подпрограммы; вот что я считаю первыми тремя строками соответствующей функции C:

двойной BDTR (K, N, P)

int k, n;

двойной р;

Похоже, что основная функция C не работает с массивами, и я не могу найти исходный код, где эта функция преобразуется в функцию Python, которая работает с массивами.

1 Ответ

0 голосов
/ 17 января 2019

В случае функций scipy.special код C содержит только «ядра» функций, то есть, как применить функцию к скалярам. Каждый из них затем оборачивается в ufunc с автоматически сгенерированным Cython кодом. Для этого используются заголовочные файлы C, например scipy/special/cephes.h, файлы объявлений Cython, например scipy/special/_cephes.pxd, файл scipy/special/functions.json, где все перечислены функции, которые должны быть сгенерированы для scipy.special, и, наконец, scipy/special/_generate_pyx.py, где фактически создается код Cython.

...