我正在编写一个包含Cython扩展和用法LAPACK
(和BLAS
)的Python模块。我打开使用两种clapack
或lapacke
,或某种f2c
或f2py
解决方案,如果必要的。重要的是,我能够在紧密的循环中从Cython调用lapack
和blas
例程,而没有Python调用开销。
我在这里找到了一个例子。但是,该示例取决于SAGE。我希望我的模块无需安装SAGE就可以安装,因为我的用户不太可能需要SAGE或其他任何东西。我的用户可能安装了numpy,scipy,pandas和scikit Learn之类的程序包,因此这些程序包是合理的依赖项。使用的接口的最佳组合是什么?最小的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)