首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用LAPACK发布基于Cython的扩展

使用LAPACK发布基于Cython的扩展
EN

Stack Overflow用户
提问于 2013-02-14 06:58:23
回答 1查看 2.4K关注 0票数 68

我正在编写一个Python模块,其中包含Cython扩展并使用LAPACK (和BLAS)。如果需要,我愿意使用clapacklapacke,或者某种f2cf2py解决方案。重要的是,我能够在紧凑的循环中调用lapackblas例程,而不会产生Python调用开销。

我找到了一个here的例子。然而,这个例子依赖于SAGE。我希望我的模块可以在不安装SAGE的情况下安装,因为我的用户不太可能想要或需要SAGE做任何其他事情。我的用户很可能已经安装了numpy、scipy、pandas和scikit learn这样的包,所以这些都是合理的依赖关系。要使用的接口的最佳组合是什么,可以获取必要信息的最小setup.py文件是什么样子(从numpy、scipy等)用于编译?

编辑:就是我最终要做的。它可以在我的macbook上使用,但我不知道它有多便携。当然还有更好的方法。

代码语言:javascript
复制
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文件中这样做:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-19 23:23:16

如果我正确理解了这个问题,您可以使用SciPy的Cython包装器来执行BLAS和LAPACK例程。下面是这些包装器的文档:

正如文档所述,您应负责检查传递给这些函数的任何数组是否针对Fortran例程正确对齐。您可以根据需要在.pyx文件中简单地导入和使用这些函数。例如:

代码语言:javascript
复制
from scipy.linalg.cython_blas cimport dnrm2 
from scipy.linalg.cython_lapack cimport dgelsy 

考虑到这是在不同平台上运行的经过良好测试、广泛使用的代码,我认为它是可靠地分发直接调用BLAS和LAPACK例程的Cython扩展的一个很好的候选者。

如果您不希望您的代码依赖于整个SciPy,您可以在本网站的linalg目录here中找到这些包装器函数的许多相关文件。一个有用的参考是these lines of setup.py,它列出了源文件和头文件。注意,Fortran编译器是必需的!

从理论上讲,这里应该可以只隔离编译BLAS和LAPACK Cython包装器所需的源文件,然后将它们作为独立的扩展与模块捆绑在一起。

在实践中,这是非常麻烦的。Linalg子模块的构建过程需要一些Python函数来帮助在不同平台(例如从here)上进行编译。构建还依赖于其他C和Fortran源文件(here),这些文件的路径被硬编码到这些Python函数中。

显然,为了确保SciPy能够在不同的操作系统和体系结构上正确编译,已经做了大量的工作。

我确信这是可能的,但是在打乱文件和调整路径之后,我还没有找到独立于SciPy的其余部分构建linalg子模块的正确方法。如果我找到了正确的方法,我一定会更新这个答案。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14864895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档