धारणा है कि किसी को कभी भी स्ट्रिंग कॉन्सटेनेशन के लिए + कभी भी उपयोग नहीं करना चाहिए, बल्कि इसके बजाय हमेशा '' का उपयोग करें। जॉइन मिथक हो सकता है। यह सच है कि +
का उपयोग अपरिवर्तनीय स्ट्रिंग ऑब्जेक्ट की अनावश्यक अस्थायी प्रतियां बनाता है लेकिन अन्य उद्धृत तथ्य यह नहीं है कि एक लूप में join
को कॉल करना आमतौर पर function call
का ओवरहेड जोड़ देगा। चलिए अपना उदाहरण लेते हैं।
दो सूचियों, लिंक किए गए तो सवाल से और दूसरा एक बड़ा बनाएं गढ़े
>>> myl1 = ['A','B','C','D','E','F']
>>> myl2=[chr(random.randint(65,90)) for i in range(0,10000)]
संबंधित join
और +
कार्यक्षमता का उपयोग करने के लिए दो काम करता है, UseJoin
और UsePlus
करने देता है।
>>> def UsePlus():
return [myl[i] + myl[i + 1] for i in range(0,len(myl), 2)]
>>> def UseJoin():
[''.join((myl[i],myl[i + 1])) for i in range(0,len(myl), 2)]
पहली सूची
>>> myl=myl1
>>> t1=timeit.Timer("UsePlus()","from __main__ import UsePlus")
>>> t2=timeit.Timer("UseJoin()","from __main__ import UseJoin")
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
2.48 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
2.61 usec/pass
>>>
वे लगभग एक ही क्रम के साथ timeit चलाने देता है।
चलें उपयोग cProfile
>>> myl=myl2
>>> cProfile.run("UsePlus()")
5 function calls in 0.001 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 <pyshell#1376>:1(UsePlus)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {range}
>>> cProfile.run("UseJoin()")
5005 function calls in 0.029 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.015 0.015 0.029 0.029 <pyshell#1388>:1(UseJoin)
1 0.000 0.000 0.029 0.029 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
5000 0.014 0.000 0.014 0.000 {method 'join' of 'str' objects}
1 0.000 0.000 0.000 0.000 {range}
और यह लग रहा है कि का उपयोग कर में शामिल हों, अनावश्यक फ़ंक्शन कॉल जो भूमि के ऊपर करने के लिए जोड़ सकते हैं में परिणाम है।
अब सवाल पर वापस आ रहा है। क्या किसी को +
join
पर सभी मामलों में उपयोग को हतोत्साहित करना चाहिए?
मेरा मानना है कि नहीं, बातें प्रश्न
कड़ी ऑपरेशन का कोई में स्ट्रिंग की
- लंबाई को ध्यान में रखा जाना चाहिए।
और विकास पूर्व-परिपक्व अनुकूलन में ऑफ-कोर्स बुरा है।
इसके neater (पाद टिप्पणी [6] देखें) और आप संयोजन ऐसा नहीं करने के लिए अधिक नियंत्रण है। लेकिन इसकी थोड़ी धीमी, स्ट्रिंग बाशिंग व्यापार बंद: पी –
क्या आप कह रहे हैं कि '+' तेज या धीमा है? और क्यों? – Taymon
+, तेजी से होता है '[2] में:% timeit" एक "* 80 +" बी "* 80' ' 1000000 छोरों, 3 का सबसे अच्छा: loop' प्रति 356 एनएस '[3]:% टाइमिट "% s% s"% ("a" * 80, "बी" * 80) ' ' 1000000 लूप, 3: 907 एनएस प्रति लूप ' –