[Python] LAPACK का उपयोग करके Cython आधारित एक्सटेंशन वितरित करें


Answers

Question

मैं एक पायथन मॉड्यूल लिख रहा हूँ जिसमें Cython एक्सटेंशन शामिल हैं और LAPACK (और BLAS ) का उपयोग करता है मैं clapack या lapacke या किसी प्रकार के f2c या f2py समाधान का उपयोग करने के लिए खोल रहा हूँ यदि आवश्यक हो महत्वपूर्ण बात यह है कि मैं पायथन कॉल ओवरहेड के बिना तंग छोरों में lapack और lapack रूटीन कॉल करने में सक्षम हूं।

मैंने यहां एक उदाहरण पाया है । हालांकि, उस उदाहरण सेज पर निर्भर करता है। मैं अपने मॉड्यूल को सैज को स्थापित किए बिना इंस्टॉल किया जाना चाहता हूं, चूंकि मेरे उपयोगकर्ता कुछ और के लिए एसएजी चाहते हैं या इसकी आवश्यकता नहीं है मेरे उपयोगकर्ताओं के पास संकुल जैसे numpy, scipy, pandas, और scikit स्थापित सीखने की संभावना है, इसलिए ये उचित निर्भरताएं होगी। उपयोग करने के लिए इंटरफेस का सबसे अच्छा संयोजन क्या है, और कम से कम setup.py फाइल किस तरह दिखती है, जिससे कि संकलन के लिए आवश्यक जानकारी (numpy, scipy, आदि) प्राप्त हो सकती है?

संपादित करें: ये है कि मैं क्या कर रहा हूं यह मेरी मैकबुक पर काम करता है, लेकिन मुझे नहीं पता कि यह कैसे पोर्टेबल है निश्चित रूप से एक बेहतर तरीका है

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'])
                   ])
)

यह इसलिए काम करता है, क्योंकि मेरी मैकबुक पर, 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)