我正在写一个Python模块,包括用Cython扩展和使用LAPACK
(和BLAS
)。 我愿意用任何clapack
或lapacke
,或某种f2c
或f2py
解决方案,如果必要的。 最重要的是,我能够调用lapack
和blas
从用Cython在没有Python的调用开销紧凑循环程序。
我发现一个例子这里 。 然而,这取决于例如SAGE。 我希望我的模块是安装不安装SAGE,因为我的用户不太可能想要或需要SAGE为别的。 我的用户很可能有像numpy的,SciPy的,熊猫包和scikit学会安装,所以这些将是合理的依赖。 什么是接口使用的最佳组合,并且会是什么最小的setup.py文件看起来像,可以获取必要的信息(从numpy的,SciPy的,等等)进行编译?
编辑:这是我落得这样做。 它适用于我的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)