पायथन में एक स्ट्रिंग को दूसरे से कुशलतापूर्वक कैसे जोड़ें
पायथन में, स्ट्रिंग को '' ऑपरेटर के साथ जोड़ना एक सामान्य कार्य है। जबकि निम्नलिखित कोड सीधा है:
var1 = "foo"
var2 = "bar"
var3 = var1 var2
यह दक्षता के बारे में प्रश्न उठाता है, विशेष रूप से बड़ी स्ट्रिंग्स या बार-बार संयोजन के लिए।
इन-प्लेस स्ट्रिंग एक्सटेंशन
सौभाग्य से, CPython स्ट्रिंग संयोजन की दक्षता बढ़ाने के लिए एक अनुकूलन लागू किया है। जब किसी स्ट्रिंग का केवल एक ही संदर्भ मौजूद होता है और उसके साथ एक और स्ट्रिंग जोड़ दी जाती है, तो CPython मूल स्ट्रिंग को उसके स्थान पर विस्तारित करने का प्रयास करता है। यह अनुकूलन ऑपरेशन को परिशोधित O(n) बनाता है।
उदाहरण के लिए, निम्नलिखित कोड O(n^2) हुआ करता था:
s = ""
for i in range(n):
s = str(i)
हालांकि, अनुकूलन के साथ, यह अब O(n) में चलता है।
पायथन कार्यान्वयन विवरण
यहां एक है पायथन सी स्रोत कोड से अंश जो अनुकूलन को दर्शाता है:
int
_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
{
/* ... */
*pv = (PyObject *)
PyObject_REALLOC((char *)v, PyBytesObject_SIZE newsize);
if (*pv == NULL) {
PyObject_Del(v);
PyErr_NoMemory();
return -1;
}
_Py_NewReference(*pv);
sv = (PyBytesObject *) *pv;
Py_SIZE(sv) = newsize;
sv->ob_sval[newsize] = '\0';
sv->ob_shash = -1; /* invalidate cached hash value */
return 0;
}
यह फ़ंक्शन एक स्ट्रिंग ऑब्जेक्ट का आकार बदलने की अनुमति देता है, लेकिन केवल तभी जब इसका केवल एक संदर्भ हो। मूल मेमोरी स्थान को संरक्षित करते समय स्ट्रिंग का आकार बदल दिया जाता है।
सावधान
यह ध्यान रखना महत्वपूर्ण है कि यह अनुकूलन पायथन विनिर्देश का हिस्सा नहीं है। इसे केवल सीपीथॉन दुभाषिया में लागू किया गया है। अन्य पायथन कार्यान्वयन, जैसे कि PyPy या Jython, विभिन्न प्रदर्शन विशेषताओं को प्रदर्शित कर सकते हैं।
अनुभवजन्य परीक्षण
अनुभवजन्य रूप से, अनुकूलन निम्नलिखित कोड के प्रदर्शन में स्पष्ट है:
import timeit
s = ""
for i in range(10):
s = 'a'
# Time the concatenation of 10 'a' characters
t1 = timeit.timeit(stmt="""s = ""
for i in range(10):
s = 'a'""", globals=globals(), number=1000000)
# Time the concatenation of 100 'a' characters
t2 = timeit.timeit(stmt="""s = ""
for i in range(100):
s = 'a'""", globals=globals(), number=100000)
# Time the concatenation of 1000 'a' characters
t3 = timeit.timeit(stmt="""s = ""
for i in range(1000):
s = 'a'""", globals=globals(), number=10000)
print("10 'a':", t1)
print("100 'a':", t2)
print("1000 'a':", t3)
परिणाम निष्पादन समय में उल्लेखनीय वृद्धि दिखाते हैं क्योंकि संयोजनों की संख्या बढ़ती है, यह दर्शाता है कि अनुकूलन बड़ी स्ट्रिंग्स के लिए लागू नहीं है।
निष्कर्ष
हालांकि पायथन का इन-प्लेस स्ट्रिंग एक्सटेंशन अनुकूलन नाटकीय रूप से कुछ हद तक स्ट्रिंग संयोजन की दक्षता में सुधार करता है परिदृश्यों में, इस कार्यान्वयन की सीमाओं को समझना आवश्यक है। बड़ी स्ट्रिंग्स के लिए या जब मेमोरी प्रबंधन विचार सर्वोपरि हों, इष्टतम प्रदर्शन प्राप्त करने के लिए स्ट्रिंग हेरफेर के वैकल्पिक तरीके आवश्यक हो सकते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3