2012-04-27 14 views
6

यहाँ का उपयोग कर कार्यों मेरी बुनियादी समस्या है:ओवरलोडिंग अजगर गणित Cython

मैं अभी भी 100% CPython मेरी डेवलपर्स अनुमति देने के लिए संगत होना

from math import sin,cos,sqrt 

मैं इस फ़ाइल की जरूरत है की एक आयात के साथ एक अजगर फ़ाइल है 100% सीपीथन कोड लिखने और पायथन के लिए विकसित महान उपकरण को नियोजित करने के लिए।

अब साइथन दर्ज करें। मेरी पायथन फ़ाइल में, ट्रिग फ़ंक्शंस को लाखों बार कॉल किया जाता है (कोड के लिए मूलभूत, इसे बदल नहीं सकता है)। वहाँ किसी भी तरह से है कि मुख्य अजगर फ़ाइल में कुछ अजगर-फू, या Cython जादू के माध्यम से अन्यथा मैं बजाय सी का उपयोग कर सकते है/C++ गणित Cython कोड पर कुछ परिवर्तन का उपयोग कार्यों

cdef extern from "math.h": 
    double sin(double) 

जो मुझे निकट देना होगा सी प्रदर्शन, जो भयानक होगा।

Stefan's talk कहते हैं विशेष रूप से यह किया जा सकता है, लेकिन बात दो साल पुराना है, और कई रचनात्मक लोगों वहाँ

+3

मैं यकीन है कि CPython पहले से ही इन कार्यों आंतरिक रूप से उपयोग करता हूँ। वे बुनियादी गणितीय परिचालनों का पुनर्मूल्यांकन क्यों करेंगे? – ThiefMaster

+4

यदि आप बड़ी संख्या में मानों के लिए ट्रिग फ़ंक्शंस को कॉल करने जा रहे हैं, तो उन मानों को नम्पी सरणी में पैक करना और 'np.sin' और दोस्तों को कॉल करना पर विचार करें। –

+0

@ थिफमास्टर - एससीआरटी फ़ंक्शन आयात करने वाली मेरी फ़ाइल से उत्पन्न साइथन ने .c कोड को देखा है, यह math.h संस्करणों का उपयोग नहीं करता है, जो दुर्भाग्यपूर्ण है – ibell

उत्तर

2

मैं एक Cython विशेषज्ञ नहीं हूँ देखते हैं, लेकिन AFAIK, तुम सब कर सकता है sin के आसपास एक साइथन रैपर लिखें और उसे कॉल करें। मैं कल्पना नहीं कर सकता कि वास्तव में math.sin से तेज़ होने वाला है, हालांकि, यह अभी भी पाइथन कॉलिंग सेमेन्टिक्स का उपयोग कर रहा है - ओवरहेड फ़ंक्शन को कॉल करने के लिए सभी पायथन सामग्री में है, वास्तविक ट्रिग गणना नहीं, जो सी में किए जाते हैं CPython का उपयोग भी।

क्या आपने Cython pure mode का उपयोग करने पर विचार किया है, जो स्रोत CPython-compatible बनाता है?

+0

बिल्कुल, मैं इसे शुद्ध पायथन मोड में करने की कोशिश कर रहा हूं । ऐसा लगता है, और मुझे लगता है कि मैं इसे सत्यापित कर सकता हूं, कि साइथन 'math.h' फ़ंक्शंस का उपयोग करने के लिए हुड के नीचे जादू करता है। – ibell

+0

संपादित करें: साइथन सी/सी ++ गणित कार्यों का उपयोग नहीं करता है, भले ही चर स्थिर रूप से टाइप किए जाते हैं। – ibell

+2

@ibell: यह तब होता है जब आप उन्हें स्पष्ट रूप से आयात करते हैं: 'libc.math cimport sqrt' से। –

0

मैं आपकी समस्या को गलत समझा है सकते हैं, लेकिन Cython documentation on interfacing with external C code निम्न सिंटैक्स का सुझाव लगता है:

cdef extern from "math.h": 
    double c_sin "sin" (double) 

जो समारोह (सी कोड में नाम sin देता है ताकि वह math.h से कार्य करने के लिए लिंक), और पाइथन मॉड्यूल में c_sin। मुझे सच में यकीन नहीं है कि मैं समझता हूं कि यह इस मामले में क्या प्राप्त करता है, हालांकि - आप साइथन कोड में math.sin का उपयोग क्यों करना चाहेंगे? क्या आपके पास कुछ स्थाई रूप से टाइप किए गए चर हैं, और कुछ गतिशील रूप से टाइप किए गए हैं?

+0

दुर्भाग्यवश, जब तक कि मुझे कुछ याद नहीं आ रहा है, यह चाल नहीं करेगा। मैंने इसे अपनी पीएक्सडी फाइल में एक सनकी पर जोड़ने की कोशिश की, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा था। यद्यपि कि आपकी इस सहायता के लिए धन्यवाद। – ibell

2

Cython के दस्तावेज़ से एक example में, वे इस लक्ष्य को हासिल करने के लिए एक सी पुस्तकालय से एक cimport का उपयोग करें:

from libc.math cimport sin 
+0

लेकिन यह आयात पाइथन लाइब्रेरी से शुद्ध पायथन मोड में आयात को ओवरराइट नहीं करता है – ibell

+0

आप उपयोगकर्ता को कमांड लाइन तर्क या फ़ंक्शन पैरामीटर के लिए क्यों नहीं पूछते हैं जो आपके कोड को इंगित करता है कि आप पाइथन या साइथन में चल रहे हैं या नहीं, और उसके बाद उपयुक्त 'पाप' समारोह आयात करें? –