का उपयोग कर साइथन आधारित एक्सटेंशन वितरित करना मैं एक पायथन मॉड्यूल लिख रहा हूं जिसमें साइथन एक्सटेंशन शामिल हैं और LAPACK
(और BLAS
) का उपयोग करता है। मैं clapack
या lapacke
या किसी प्रकार के f2c
या f2py
समाधान का उपयोग करने के लिए खोलने के लिए खुला हूं। महत्वपूर्ण बात यह है कि मैं पाइथन कॉल ओवरहेड के बिना सख्त लूप में lapack
और blas
रूटीन को कॉल करने में सक्षम हूं।LAPACK
मुझे एक उदाहरण मिला है here। हालांकि, वह उदाहरण एसएजी पर निर्भर करता है। मैं चाहता हूं कि मेरा मॉड्यूल SAGE इंस्टॉल किए बिना इंस्टॉल करने योग्य हो, क्योंकि मेरे उपयोगकर्ता किसी और चीज़ के लिए SAGE की आवश्यकता या आवश्यकता नहीं है। मेरे उपयोगकर्ताओं के पास 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
रूप में एक ही निर्देशिका में है। मैं तो मेरे सिक्कों के नमूने रखने का बक्स फ़ाइल में ऐसा कर सकते हैं:
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)
मेरी धारणा यह है कि प्रश्न इस बात के बारे में अधिक है कि स्वाद/numpy के साथ आने वाले ब्लैस से कैसे लिंक करें और यह प्रत्येक कंप्यूटर पर दोबारा उपयोग किए बिना एकाधिक कंप्यूटरों (scipy/numpy इंस्टॉल के साथ) पर काम करता है। लेकिन scipy प्रदान रैपर का उपयोग करने की सलाह अच्छी है। – DavidW
आह, आप वहां सही हो सकते हैं। यदि ओपी और स्पष्टीकरण प्रदान करता है तो मैं आवश्यकतानुसार इस उत्तर को परिष्कृत या हटा सकता हूं (या इसे किसी टिप्पणी में परिवर्तित कर सकता हूं)। –
यह करने का यह एक शानदार तरीका है। @ डेविडड सही है कि मैं ऐसे समाधान की तलाश में था जो पोर्टेबल है और उपयोगकर्ताओं को अतिरिक्त पुस्तकालय स्थापित करने की आवश्यकता नहीं है। मुझे लगता है कि यह उन चीजों को उचित setup.py फ़ाइल के साथ है। एजेसीआर, क्या आप एक उदाहरण setup.py जोड़ सकते हैं जो दिखाता है कि किसी भी आवश्यक निर्देशिका को कैसे प्राप्त करें? मुझे लगता है कि numpy.get_include() सब कुछ जरूरी है? – jcrudy