2011-11-09 20 views
14

मेरे पास एक गेम प्रोजेक्ट के लिए सी में कुछ फ़ंक्शन लिखे गए हैं। इन कार्यों को काफी कुछ कहा जाता है (प्रति सेकंड 2000-4000 बार)। कच्चे गति के लिए सी में कार्य लिखे गए हैं।ctypes बनाम सी एक्सटेंशन

अब, इन कार्यों को पायथन में शामिल करने का सबसे आसान तरीका ctypes का उपयोग करना है। विकल्प इन कार्यों के चारों ओर पाइथन को सी एक्सटेंशन लिखना है (जो अतिरिक्त प्रयासों का थोड़ा सा हिस्सा लेता है)। तो मैंने सोचा, डीएलएल की शुरुआती लोडिंग सहित, ctypes का ओवरहेड कितना बड़ा है?


मैं अजगर 2.7 (मानक CPython विज्ञप्ति) का उपयोग कर रहा है, और मैं Cython की तरह एक बाहरी पुस्तकालय का उपयोग नहीं करना चाहते हैं।

मुझे पता है कि इस सवाल से पहले पूछा गया है, लेकिन मैंने दो विकल्पों के बीच प्रदर्शन तुलना के बारे में अधिक जानकारी नहीं देखी है।

+0

ठीक है, पीपीपी की जेआईटी रिलीज या दो के बाद से 'सीटीपीएस' कॉल के लिए बहुत बढ़िया कोड उत्पन्न कर सकती है। आप इसे एक शॉट देना चाहते हैं। मैं इसे उत्तर के रूप में पोस्ट नहीं करता क्योंकि मेरे पास हार्ड डेटा नहीं है और यह स्पष्ट नहीं है कि स्विचिंग दुभाषिया आपके लिए एक विकल्प है या नहीं। – delnan

+0

मैं ओवरहेड समान होने की अपेक्षा करता हूं। –

+0

@ डेलनान: यह एक ऐसा गेम है जिसे मैं जहाज पर जा रहा हूं - लिनक्स भी। मैं अपने उपयोगकर्ताओं से पीपीपी स्थापित करने के लिए नहीं कह सकता। – orlp

उत्तर

10

मैंने सी एक्सटेंशन बनाम एक सीटीपीएस रैपर के प्रदर्शन की तुलना की है। मेरे विशेष परीक्षण में, अंतर लगभग 250x था। सी लाइब्रेरी में कई कॉल थे इसलिए सीटीपीएस रैपर भी पायथन कोड निष्पादित कर रहा था। सी लाइब्रेरी के लिए चलने का समय बहुत छोटा था जिसने पायथन कोड के लिए अतिरिक्त ओवरहेड को और भी महत्वपूर्ण बना दिया। तो अनुपात आपके लिए अलग होगा लेकिन मेरे मामले में महत्वपूर्ण था।

+5

तो 250x धीमी गति से कौन सा था? – delnan

+1

@ डेलनान: उनके जवाब से मैं पढ़ सकता हूं ctypes wrapper धीमा था। – orlp

6

सीधे सी कोडेड इंटरफ़ेस में बहुत तेज होने की संभावना है। बाधा पाइथन से सी तक इंटरफ़ेस है और तर्कों को मार्शलिंग करना है और परिणाम उदाहरण के लिए तारों की प्रतिलिपि बनाना या पाइथन सूचियों को सी सरणी से कनवर्ट करना शामिल कर सकते हैं। यदि आपके पास एक लूप है जो इन कॉलों में से कई सौ बनाता है और कुछ डेटा को प्रत्येक कॉल के लिए अलग से मार्शल नहीं किया जाना चाहिए तो आपको केवल सी में लूप को दोबारा करना होगा और आप बाधा को बड़े पैमाने पर कम करने में सक्षम हो सकते हैं । ctypes आपको वह विकल्प नहीं देता है: आप जो भी कर सकते हैं वह मौजूदा कार्यों को सीधे कॉल कर रहा है।

बेशक यह सब इस बात पर निर्भर करता है कि आप किस प्रकार के कार्यों को बुला रहे हैं और आप किस प्रकार के डेटा को पार कर रहे हैं। ऐसा हो सकता है कि आप ओवरहेड को कम नहीं कर सकते हैं, इस मामले में मैं अभी भी सीटीपीएस धीमा होने की अपेक्षा करता हूं लेकिन शायद महत्वपूर्ण नहीं है।

आपका सबसे अच्छा सर्वश्रेष्ठ आपके कोड के कुछ नमूने को हर तरह से लिखा जाना चाहिए और इसे बेंचमार्क करना होगा। अन्यथा एक निश्चित उत्तर के लिए बहुत सारे चर हैं।

+0

जिस डेटा के बारे में हम बात कर रहे हैं वह एक बिटमास्क (टकराव के लिए) है। मेरे पास सी कार्यान्वयन तैयार है, और केवल पायथन कोड में चारों ओर पारित डेटा बूलियन, निर्देशांक और नई पायथन बिटमैस्क कक्षाएं हैं (जिनमें केवल वास्तविक डेटा के लिए एक सूचक होता है, जो सी कोड में रहता है)। – orlp

संबंधित मुद्दे