कॉल महंगा होने पर पायथन में एकल जिम्मेदारी सिद्धांत (एसआरपी) के माध्यम से काम करना


12

कुछ आधार बिंदु:

  • इसकी व्याख्या की प्रकृति के कारण अजगर विधि कॉल "महंगी" है । सिद्धांत रूप में, यदि आपका कोड काफी सरल है, तो पायथन कोड को तोड़ने से पठनीयता और पुन: उपयोग के अलावा नकारात्मक प्रभाव पड़ता है ( जो डेवलपर्स के लिए एक बड़ा लाभ है, उपयोगकर्ताओं के लिए इतना नहीं )।
  • एकल जिम्मेदारी सिद्धांत (एसआरपी) कोड को पठनीय रखता है, परीक्षण करना और बनाए रखना आसान है।
  • परियोजना में एक विशेष प्रकार की पृष्ठभूमि है, जहां हम पठनीय कोड, परीक्षण और समय प्रदर्शन चाहते हैं।

उदाहरण के लिए, इस तरह का कोड जो कई तरीकों (x4) को आमंत्रित करता है, वह एक की तुलना में धीमा है जो सिर्फ एक है।

from operator import add

class Vector:
    def __init__(self,list_of_3):
        self.coordinates = list_of_3

    def move(self,movement):
        self.coordinates = list( map(add, self.coordinates, movement))
        return self.coordinates

    def revert(self):
        self.coordinates = self.coordinates[::-1]
        return self.coordinates

    def get_coordinates(self):
        return self.coordinates

## Operation with one vector
vec3 = Vector([1,2,3])
vec3.move([1,1,1])
vec3.revert()
vec3.get_coordinates()

इसकी तुलना में:

from operator import add

def move_and_revert_and_return(vector,movement):
    return list( map(add, vector, movement) )[::-1]

move_and_revert_and_return([1,2,3],[1,1,1])

अगर मैं ऐसा कुछ समांतर करने के लिए कर रहा हूँ, यह बहुत उद्देश्य है मैं प्रदर्शन खो देते हैं। मन जो सिर्फ एक उदाहरण है; मेरी परियोजना में गणित के साथ कई मिनी रूटीन हैं जैसे कि - जबकि इसके साथ काम करना बहुत आसान है, हमारे प्रोफाइलर्स इसे नापसंद कर रहे हैं।


पायथन में प्रदर्शन के साथ समझौता किए बिना हम एसआरपी को कैसे और कहां से ग्रहण करते हैं, क्योंकि इसका अंतर्निहित कार्यान्वयन सीधे तौर पर इसे प्रभावित करता है?

क्या कुछ प्रकार के पूर्व-प्रोसेसर जैसे वर्कअराउंड हैं, जो रिलीज के लिए चीजों को लाइन में रखते हैं?

या कोड ब्रेकडाउन से निपटने में पायथन बस गरीब है?



19
इसके लायक क्या है, आपके दो कोड उदाहरण जिम्मेदारियों की संख्या में भिन्न नहीं हैं। एसआरपी एक मतगणना अभ्यास नहीं है।
रॉबर्ट हार्वे

2
@RobertHarvey आप सही हैं, खराब उदाहरण के लिए क्षमा करें और मेरे पास समय होने पर मैं बेहतर संपादन करूंगा। या तो मामले में, पठनीयता और मुख्यता ग्रस्त है और अंततः एसआरपी कोडबेस के भीतर टूट जाता है क्योंकि हम कक्षाओं और उनके तरीकों पर कटौती करते हैं।
लुकासगैब

4
ध्यान दें कि किसी भी भाषा में फ़ंक्शन कॉल महंगे हैं , हालांकि एओटी कंपाइलरों में इनलाइनिंग की विलासिता है
ईवे

6
अजगर जैसे अजगर के एक JITted कार्यान्वयन का उपयोग करें। ज्यादातर इस समस्या को ठीक करना चाहिए।
बकुरीउ

जवाबों:


17

क्या पायथन बस कोड टूटने से पूरी तरह से गरीब है?

दुर्भाग्य से हाँ, पायथन धीमा है और लोगों के बारे में बहुत से उपाख्यान हैं जो कि कार्यों को लगातार बढ़ाते हैं और उनके कोड को बदसूरत बनाते हैं।

साइथॉन के चारों ओर एक काम है, जो पायथन का एक संकलित संस्करण है और बहुत तेज है।

- मैं सिर्फ कुछ टिप्पणियों और अन्य उत्तरों को संबोधित करना चाहता था। हालांकि उनमें से जोर शायद अजगर विशिष्ट है। लेकिन अधिक सामान्य अनुकूलन।

  1. जब तक आपको कोई समस्या न हो, तब तक अनुकूलन न करें और फिर अड़चनें देखें

    आम तौर पर अच्छी सलाह। लेकिन धारणा यह है कि 'सामान्य' कोड आमतौर पर निष्पादित होता है। यह हमेशा मामला नहीं है। अलग-अलग भाषाओं और रूपरेखाओं में से प्रत्येक की अपनी अलग पहचान है। इस मामले में फ़ंक्शन कॉल करता है।

  2. इसकी केवल कुछ मिलीसेकंड, अन्य चीजें धीमी होंगी

    यदि आप एक शक्तिशाली डेस्कटॉप कंप्यूटर पर अपना कोड चला रहे हैं, तो संभवत: आपको परवाह नहीं है जब तक कि आपका एकल उपयोगकर्ता कोड कुछ सेकंड में निष्पादित नहीं होता है।

    लेकिन व्यवसाय कोड कई उपयोगकर्ताओं के लिए चलता है और लोड का समर्थन करने के लिए एक से अधिक मशीन की आवश्यकता होती है। यदि आपका कोड दो बार तेजी से चलता है तो इसका मतलब है कि आपके पास उपयोगकर्ताओं की संख्या का दोगुना या मशीनों की आधी संख्या हो सकती है।

    यदि आप अपनी मशीनों और डेटा सेंटर के मालिक हैं तो आपके पास आमतौर पर सीपीयू पावर में ओवरहेड का एक बड़ा हिस्सा होता है। यदि आपका कोड थोड़ा धीमा चलता है, तो आप इसे अवशोषित कर सकते हैं, कम से कम तब तक जब तक आपको दूसरी मशीन खरीदने की आवश्यकता न हो।

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

    प्रदर्शन में सुधार एक क्लाउड आधारित व्यवसाय के लिए मुख्य व्यय में भारी कटौती कर सकता है और प्रदर्शन वास्तव में सामने और केंद्र होना चाहिए।


1
जबकि रॉबर्ट का जवाब इस तरह के अनुकूलन (जो इस सवाल को फिट बैठता है ) को करने के पीछे संभावित गलतफहमी के लिए कुछ आधारों को कवर करने में मदद करता है , मुझे लगता है कि यह स्थिति को और अधिक सीधे और पायथन संदर्भ के साथ-साथ जवाब देता है।
लुकासग्कब

2
खेद है कि इसकी कमी है। मेरे पास और लिखने का समय नहीं है। लेकिन मुझे लगता है कि रॉबर्ट इस पर गलत है। अजगर के साथ सबसे अच्छी सलाह आपको कोड के रूप में प्रोफ़ाइल करने की लगती है । न मानें कि यह प्रदर्शनकारी होगा और केवल तभी अनुकूलित होगा जब आपको कोई समस्या मिले
Ewan

2
@ इवान: आपको मेरी सलाह मानने के लिए पहले पूरे कार्यक्रम को लिखने की ज़रूरत नहीं है। पर्याप्त रूपरेखा प्राप्त करने के लिए एक विधि या दो पर्याप्त से अधिक है।
रॉबर्ट हार्वे

1
आप पेपी को भी आजमा सकते हैं, जो कि एक JITted पायथन है
Eevee

2
@ ईवान यदि आप वास्तव में फ़ंक्शन कॉल के प्रदर्शन ओवरहेड के बारे में चिंतित हैं, तो आप जो कुछ भी कर रहे हैं वह संभवतः अजगर के लिए अनुकूल नहीं है। लेकिन तब मैं वास्तव में वहाँ कई उदाहरणों के बारे में नहीं सोच सकता। व्यवसाय कोड का अधिकांश भाग IO सीमित है और CPU भारी सामान को आमतौर पर देशी पुस्तकालयों (सुस्ता, टेनसफ़्लो और इतने पर) को कॉल करके नियंत्रित किया जाता है।
वू

50

कई संभावित प्रदर्शन चिंताएं वास्तव में व्यवहार में कोई समस्या नहीं हैं। आपके द्वारा उठाया गया मुद्दा उनमें से एक हो सकता है। वर्नाक्यूलर में, हम उन समस्याओं के बारे में चिंता किए बिना सबूत के बारे में चिंता करते हैं कि वे वास्तविक समस्याएं हैं समय से पहले अनुकूलन।

यदि आप किसी वेब सेवा के लिए फ्रंट-एंड लिख रहे हैं, तो आपका प्रदर्शन फ़ंक्शन कॉल से काफी प्रभावित नहीं होने वाला है, क्योंकि किसी नेटवर्क पर डेटा भेजने की लागत विधि कॉल करने में लगने वाले समय से अधिक हो जाती है।

यदि आप एक तंग लूप लिख रहे हैं जो वीडियो स्क्रीन को एक सेकंड में साठ बार ताज़ा करता है, तो यह बात हो सकती है। लेकिन उस बिंदु पर, मेरा दावा है कि यदि आपके पास पायथन का उपयोग करने की कोशिश हो रही है, तो आपके लिए बड़ी समस्याएं हैं, एक ऐसा काम जिसके लिए अजगर संभवत: अनुकूल नहीं है।

हमेशा की तरह, आपके द्वारा पता लगाने का तरीका मापना है। अपने कोड पर एक प्रदर्शन प्रोफाइलर या कुछ टाइमर चलाएं। देखें कि क्या यह व्यवहार में एक वास्तविक समस्या है।


एकल उत्तरदायित्व सिद्धांत एक कानून या जनादेश नहीं है; यह एक दिशानिर्देश या सिद्धांत है। सॉफ्टवेयर डिजाइन हमेशा ट्रेड-ऑफ के बारे में होता है; कोई निरपेक्ष नहीं हैं। गति के लिए पठनीयता और / या स्थिरता को व्यापार करना असामान्य नहीं है, इसलिए आपको प्रदर्शन की वेदी पर एसआरपी का त्याग करना पड़ सकता है। लेकिन जब तक आप जानते हैं कि आपके पास प्रदर्शन समस्या नहीं है, तब तक उस ट्रेडऑफ़ को न बनाएं ।


3
मुझे लगता है कि यह सच था, जब तक हमने क्लाउड कंप्यूटिंग का आविष्कार नहीं किया। अब दो कार्यों में से एक प्रभावी रूप से 4 गुना लागत के रूप में अन्य
इवान

2
@ 4 बार तब तक कोई फर्क नहीं पड़ता जब तक आप इसे माप नहीं लेते कि इसकी देखभाल करने के लिए पर्याप्त महत्वपूर्ण है। अगर फू 1 एमएस लेता है और बार 4 एमएस लेता है तो यह अच्छा नहीं है। जब तक आप यह महसूस नहीं करते हैं कि नेटवर्क में डेटा संचारित करने में 200 एमएस लगते हैं। उस समय, बार धीमा होना इतना मायने नहीं रखता है। (सिर्फ एक संभावित उदाहरण जहां एक्स एक्स
स्लोअर

8
@ इवान अगर बिल में कमी से आपको $ 15 / महीना की बचत होती है, लेकिन इसे ठीक करने और परीक्षण करने के लिए $ 125 / घंटा ठेकेदार को 4 घंटे का समय लगेगा, तो मैं आसानी से उचित ठहरा सकता हूं कि ऐसा करने के लिए किसी व्यवसाय के समय के लायक नहीं है (या कम से कम सही नहीं है अब अगर बाजार के लिए समय महत्वपूर्ण है, आदि)। हमेशा ट्रेडऑफ होते हैं। और जो एक परिस्थिति में होता है वह दूसरे में नहीं होता।
१६:५१

3
आपके AWS बिल वास्तव में बहुत कम हैं
Ewan

6
@Ewan AWS ने किसी भी तरह से बैचों की सीमा तक (मानक 100ms है)। इसका मतलब है कि इस तरह का अनुकूलन आपको कुछ भी बचाता है अगर यह लगातार आपको अगले भाग में धकेलने से बचता है।
19

2

सबसे पहले, कुछ स्पष्टीकरण: पायथन एक भाषा है। कई अलग-अलग व्याख्याकार हैं जो पायथन भाषा में लिखे गए कोड को निष्पादित कर सकते हैं। संदर्भ कार्यान्वयन (CPython) आमतौर पर वह है जिसे संदर्भित किया जाता है जब कोई "पायथन" के बारे में बात करता है जैसे कि यह एक कार्यान्वयन है, लेकिन प्रदर्शन विशेषताओं के बारे में बात करते समय सटीक होना महत्वपूर्ण है, क्योंकि वे कार्यान्वयन के बीच बेतहाशा भिन्न हो सकते हैं।

पायथन में प्रदर्शन के साथ समझौता किए बिना हम एसआरपी को कैसे और कहां से ग्रहण करते हैं, क्योंकि इसका अंतर्निहित कार्यान्वयन सीधे तौर पर इसे प्रभावित करता है?

केस 1.) यदि आपके पास शुद्ध पायथन कोड है (<= पायथन भाषा संस्करण 3.5, 3.6 में "बीटा स्तर का समर्थन है") जो केवल शुद्ध पायथन मॉड्यूल पर निर्भर करता है, तो आप हर जगह SRP को गले लगा सकते हैं और इसे चलाने के लिए PyPy का उपयोग कर सकते हैं। PyPy ( https://morepypy.blogspot.com/2019/03/pypy-v71-released-now-uses-utf-8.html ) एक पायथन इंटरप्रिटर है, जिसमें जस्ट इन टाइम कंपाइलर (JIT) है और यह फ़ंक्शन को हटा सकता है ओवरहेड कॉल करें जब तक कि निष्पादित कोड (कुछ सेकंड IIRC) को ट्रेस करके "वार्म अप" करने के लिए पर्याप्त समय हो। **

यदि आप सीपीथॉन दुभाषिया का उपयोग करने के लिए प्रतिबंधित हैं, तो आप सी में लिखे गए विस्तार में धीमी गति से कार्य कर सकते हैं, जो पूर्व संकलित होगा और किसी भी दुभाषिया ओवरहेड से पीड़ित नहीं होगा। आप अभी भी हर जगह एसआरपी का उपयोग कर सकते हैं, लेकिन आपका कोड पायथन और सी के बीच विभाजित हो जाएगा। क्या यह चुनिंदा एसआरपी को छोड़ने की तुलना में बेहतर या बदतर है, लेकिन केवल पायथन कोड से चिपके रहना आपकी टीम पर निर्भर करता है, लेकिन यदि आपके पास प्रदर्शन के महत्वपूर्ण खंड हैं कोड, यह निस्संदेह CPython द्वारा व्याख्या किए गए सबसे अधिक अनुकूलित शुद्ध पायथन कोड से भी तेज होगा। पायथन के कई सबसे तेज गणितीय पुस्तकालय इस विधि (सुन्न और डरावना IIRC) का उपयोग करते हैं। जो केस 2 में एक अच्छा तर्क है ...

केस 2.) यदि आपके पास पायथन कोड है जो C एक्सटेंशन का उपयोग करता है (या पुस्तकालयों पर निर्भर करता है जो C एक्सटेंशन का उपयोग करते हैं), PyPy उनके लिखे जाने के आधार पर उपयोगी हो सकता है या नहीं भी हो सकता है। देखें http://doc.pypy.org/en/latest/extending.html जानकारी के लिए, लेकिन सारांश CFFI न्यूनतम भूमि के ऊपर है कि जब तक ctypes धीमी (इसे प्रयोग PyPy के साथ भी धीमी CPython से हो सकता है) है

Cython ( https://cython.org/ ) एक और विकल्प है, जिसका मुझे उतना अनुभव नहीं है। मैं इसे पूर्णता के लिए उल्लेख करता हूं, इसलिए मेरा जवाब "अपने दम पर खड़ा हो सकता है", लेकिन किसी भी विशेषज्ञता का दावा नहीं करना चाहिए। मेरे सीमित उपयोग से, ऐसा महसूस हुआ कि मुझे PyPy के साथ "मुफ्त में" प्राप्त करने के लिए उसी गति में सुधार करने के लिए कड़ी मेहनत करनी पड़ी, और अगर मुझे PyPy से बेहतर कुछ चाहिए, तो अपना सी एक्सटेंशन लिखना इतना आसान था ( जिसका फायदा यह है कि अगर मैं कोड को कहीं और दोबारा इस्तेमाल करता हूं या इसका हिस्सा किसी लाइब्रेरी में निकालता हूं, तो मेरा सारा कोड अभी भी किसी पायथन इंटरप्रेटर के तहत चल सकता है और साइथन द्वारा चलाया जाना जरूरी नहीं है)।

मुझे साइथॉन में "बंद" होने का डर है, जबकि PyPy के लिए लिखा गया कोई भी कोड CPython के तहत चल सकता है।

** उत्पादन में PyPy पर कुछ अतिरिक्त नोट

किसी भी विकल्प को बनाने में बहुत सावधानी बरतें जो कि एक बड़े कोडबेस में "आपको लॉक करने" का व्यावहारिक प्रभाव है। क्योंकि कुछ (बहुत लोकप्रिय और उपयोगी) तीसरे पक्ष के पुस्तकालय पहले बताए गए कारणों के लिए अच्छा नहीं खेलते हैं, यह बाद में बहुत कठिन निर्णय ले सकता है यदि आपको पता है कि आपको उन पुस्तकालयों में से एक की आवश्यकता है। मेरा अनुभव मुख्य रूप से PyPy का उपयोग करके कुछ (लेकिन सभी नहीं) को गति देने के लिए किया गया है, जो एक कंपनी के वातावरण में प्रदर्शन के प्रति संवेदनशील हैं, जहां यह हमारे उत्पादन वातावरण में नगण्य जटिलता को जोड़ता है (हम पहले से ही कई भाषाओं में तैनात हैं, कुछ अलग-अलग प्रमुख संस्करणों के साथ 2.7 बनाम। 3.5 रन वैसे भी)।

मैंने PyPy और CPython दोनों का उपयोग करते हुए नियमित रूप से मुझे कोड लिखने के लिए मजबूर किया है जो केवल भाषा विनिर्देश द्वारा की गई गारंटी पर निर्भर करता है, न कि कार्यान्वयन विवरण पर जो किसी भी समय परिवर्तन के अधीन हैं। आप इस तरह के विवरण के बारे में सोचकर अतिरिक्त बोझ महसूस कर सकते हैं, लेकिन मैंने इसे अपने पेशेवर विकास में मूल्यवान पाया, और मुझे लगता है कि यह संपूर्ण रूप से पायथन पारिस्थितिकी तंत्र के लिए "स्वस्थ" है।


हाँ! मैं सिद्धांत को छोड़ने और जंगली कोड लिखने के बजाय इस मामले के लिए सी एक्सटेंशन पर ध्यान केंद्रित करने पर विचार कर रहा हूं, अन्य उत्तरों ने मुझे यह आभास दिया कि यह तब तक धीमा होगा, जब तक कि मैं संदर्भ दुभाषिया से अदला-बदली नहीं करता - इसे साफ़ करने के लिए, OOP अभी भी आपके विचार में एक समझदार दृष्टिकोण है?
लुकासगक्रब

1
केस 1 के साथ (2 डी पैरा) क्या आपको फंक्शन्स कॉल करने के लिए एक ही ओवर हेड नहीं मिलता है , भले ही फंक्शन खुद कंप्लीट हों?
इवान

CPython एकमात्र दुभाषिया है जिसे आम तौर पर गंभीरता से लिया जाता है। PyPy दिलचस्प है , लेकिन यह निश्चित रूप से किसी भी तरह का व्यापक रूप नहीं अपना रहा है। इसके अलावा, यह व्यवहार CPython से भिन्न है, और यह कुछ महत्वपूर्ण पैकेजों के साथ काम नहीं करता है, उदाहरण के लिए। कुछ समझदार डेवलपर्स उत्पादन के लिए PyPy की सिफारिश करेंगे। जैसे, भाषा और कार्यान्वयन के बीच का अंतर व्यवहार में असंगत है।
jpmc26

मुझे लगता है कि आप सिर पर कील मारते हैं। कोई कारण नहीं है कि आप एक बेहतर व्याख्याकार, या एक संकलक नहीं हो सकते। यह एक भाषा के रूप में अजगर के लिए आंतरिक नहीं है। आप सिर्फ व्यावहारिक वास्तविकताओं के साथ फंस गए हैं
इवान

@ jpmc26 मैंने उत्पादन में PyPy का उपयोग किया है, और अन्य अनुभवी डेवलपर्स के साथ ऐसा करने पर विचार करने की सलाह देता हूं। यह हल्के बाकी एपीआई के लिए (एक उदाहरण के रूप में) falconframework.org का उपयोग करते हुए microservices के लिए बहुत अच्छा है । व्यवहार में भिन्नता है क्योंकि डेवलपर्स कार्यान्वयन विवरणों पर भरोसा करते हैं जो भाषा की गारंटी नहीं है, PyPy का उपयोग नहीं करने का एक कारण नहीं है। यह आपके कोड को फिर से लिखने का एक कारण है। यदि कोडिथॉन इसके कार्यान्वयन में परिवर्तन करता है (जो कि जब तक यह अभी भी भाषा की युक्ति के अनुरूप है, तब तक यह करने के लिए स्वतंत्र है) समान कोड वैसे भी टूट सकता है।
स्टीवन जैक्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.