Je suis en train d'écrire un module Python qui inclut des extensions Cython et utilise LAPACK
(et BLAS
). Je suis prêt à utiliser soit clapack
ou lapacke
ou une sorte de f2c
ou f2py
solution si nécessaire. Ce qui est important, c'est que je puisse appeler lapack
y blas
des routines de Cython dans des boucles serrées sans surcharge d'appels Python.
J'ai trouvé un exemple aquí . Cependant, cet exemple dépend de SAGE. Je veux que mon module puisse être installé sans installer SAGE, car mes utilisateurs ne voudront probablement pas ou n'auront pas besoin de SAGE pour autre chose. Mes utilisateurs sont susceptibles d'avoir installé des paquets tels que numpy, scipy, pandas et scikit learn, ce qui constitue des dépendances raisonnables. Quelle est la meilleure combinaison d'interfaces à utiliser, et à quoi ressemblerait le fichier setup.py minimal qui pourrait récupérer les informations nécessaires (de numpy, scipy, etc.) pour la compilation ?
EDIT : Voici ce que j'ai fini par faire. Cela fonctionne sur mon macbook, mais je n'ai aucune idée de sa portabilité. Il y a sûrement un meilleur moyen.
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'])
])
)
Cela fonctionne parce que, sur mon macbook, l'option clapack.h
se trouve dans le même répertoire que le fichier d'en-tête cblas.h
. Je peux alors faire cela dans mon fichier 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)