Я пишу модуль Python, который включает расширения Cython и использует LAPACK
(и BLAS
). Я открыт для использования clapack
или lapacke
или какого-либо решения f2c
или f2py
, если это необходимо. Важно то, что я могу называть LAPACK
и BLAS
подпрограммы из Cython в узких циклах без накладных вызовов Python.
Я нашел один пример здесь. Однако этот пример зависит от SAGE. Я хочу, чтобы мой модуль устанавливался без установки SAGE, так как мои пользователи вряд ли захотят или нуждаются в SAGE для чего-либо еще. У моих пользователей, скорее всего, будут такие пакеты, как numpy, scipy, pandas и scikit learn, поэтому они будут разумными зависимостями. Какая оптимальная комбинация интерфейсов для использования, и какой бы минимальный файл setup.py выглядел так, можно было получить необходимую информацию (от numpy, scipy и т.д.) Для компиляции?
EDIT: Вот что я в итоге сделал. Он работает на моем macbook, но я понятия не имею, насколько портативен он. Конечно, лучший способ.
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
from Cython.Build import cythonize
from numpy.distutils.system_info import get_info
# TODO: This cannot be the right way
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:]
includes = [blas_include,numpy.get_include()]
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"],
include_dirs = includes,
libraries=['blas','lapack'])
])
)
Это работает, потому что в моем macbook заголовочный файл clapack.h
находится в том же каталоге, что и cblas.h
. Я могу сделать это в моем файле pyx:
ctypedef np.int32_t integer
cdef extern from "cblas.h":
double cblas_dnrm2(int N,double *X, int incX)
cdef extern from "clapack.h":
integer dgelsy_(integer *m, integer *n, integer *nrhs,
double *a, integer *lda, double *b, integer *ldb, integer *
jpvt, double *rcond, integer *rank, double *work, integer *
lwork, integer *info)