Насколько я понимаю, векторизованные функции numpy выполняются быстрее, чем циклы Python, потому что циклы выполняются в C или Fortran. Я хотел бы знать, где в исходном коде это происходит.
Например, биноминальная функция CDF scipy.special.bdtr
принимает аргументы в виде массива k,n,p
и будет возвращать символ ndarray при условии, что аргументы транслируемы. В документации сказано, что scipy.special.bdtr
- это оболочка для подпрограммы в библиотеке математических функций Cephes. Копаясь в исходном коде на Github, я нашел scipy/special/cephes/bdtr.c
содержащий код C для этой подпрограммы; вот что я считаю первыми тремя строками соответствующей функции C:
двойной бдтр (k, n, p)
int k, n;
двойной р;
Похоже, что основная функция C не работает с массивами, и я не могу найти исходный код, где эта функция преобразуется в функцию Python, которая работает с массивами.
В случае функций 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.
scipy/special/_generate_pyx.py
, поэтому я посмотрел, как писать пользовательские функции в документации Numpy. Все, что C греческий для меня.
bdtr
вы упомянули (хотяscipy
интерфейсscipy
вряд ли будет векторизован, так как bdtrbdtr
работает только с одним набором параметров).