जॉन फोहे के उत्तर के अनुसार, जब तक आपको नहीं करना है, तब तक अनुकूलन न करें, लेकिन यदि आप यहां हैं और यह सवाल पूछ रहे हैं, तो यह ठीक हो सकता है क्योंकि आप कर रहे हैं । मेरे मामले में, मुझे स्ट्रिंग चर से कुछ URL को इकट्ठा करने की आवश्यकता थी ... तेज। मैंने देखा कि कोई भी (अभी तक) स्ट्रिंग प्रारूप विधि पर विचार नहीं कर रहा है, इसलिए मैंने सोचा कि मैं कोशिश करूँगा और, ज्यादातर हल्के हित के लिए, मैंने सोचा कि मैं अच्छे औसत दर्जे के लिए स्ट्रिंग प्रक्षेप ऑपरेटर को टॉस करूँगा। सच कहूं, तो मुझे नहीं लगता था कि इनमें से कोई भी सीधे '+' ऑपरेशन या '' .join () में ढेर हो जाएगा। लेकिन अंदाज़ा लगाओ कि क्या है? मेरे पायथन 2.7.5 सिस्टम पर, स्ट्रिंग प्रक्षेप ऑपरेटर उन सभी को नियंत्रित करता है और string.format () सबसे खराब प्रदर्शनकर्ता है:
# concatenate_test.py
from __future__ import print_function
import timeit
domain = 'some_really_long_example.com'
lang = 'en'
path = 'some/really/long/path/'
iterations = 1000000
def meth_plus():
'''Using + operator'''
return 'http://' + domain + '/' + lang + '/' + path
def meth_join():
'''Using ''.join()'''
return ''.join(['http://', domain, '/', lang, '/', path])
def meth_form():
'''Using string.format'''
return 'http://{0}/{1}/{2}'.format(domain, lang, path)
def meth_intp():
'''Using string interpolation'''
return 'http://%s/%s/%s' % (domain, lang, path)
plus = timeit.Timer(stmt="meth_plus()", setup="from __main__ import meth_plus")
join = timeit.Timer(stmt="meth_join()", setup="from __main__ import meth_join")
form = timeit.Timer(stmt="meth_form()", setup="from __main__ import meth_form")
intp = timeit.Timer(stmt="meth_intp()", setup="from __main__ import meth_intp")
plus.val = plus.timeit(iterations)
join.val = join.timeit(iterations)
form.val = form.timeit(iterations)
intp.val = intp.timeit(iterations)
min_val = min([plus.val, join.val, form.val, intp.val])
print('plus %0.12f (%0.2f%% as fast)' % (plus.val, (100 * min_val / plus.val), ))
print('join %0.12f (%0.2f%% as fast)' % (join.val, (100 * min_val / join.val), ))
print('form %0.12f (%0.2f%% as fast)' % (form.val, (100 * min_val / form.val), ))
print('intp %0.12f (%0.2f%% as fast)' % (intp.val, (100 * min_val / intp.val), ))
परिणाम:
# python2.7 concatenate_test.py
plus 0.360787868500 (90.81% as fast)
join 0.452811956406 (72.36% as fast)
form 0.502608060837 (65.19% as fast)
intp 0.327636957169 (100.00% as fast)
यदि मैं एक छोटे डोमेन और छोटे पथ का उपयोग करता हूं, तो प्रक्षेप अभी भी जीतता है। अंतर अधिक स्पष्ट है, हालांकि, लंबे समय तक तार के साथ।
अब जब मेरे पास एक अच्छा परीक्षण स्क्रिप्ट था, तो मैंने पायथन 2.6, 3.3 और 3.4 के तहत भी परीक्षण किया, यहां परिणाम हैं। पायथन 2.6 में, प्लस ऑपरेटर सबसे तेज़ है! पायथन 3 पर, जीत में शामिल हों। नोट: ये परीक्षण मेरे सिस्टम पर बहुत ही दोहराने योग्य हैं। इसलिए, 'प्लस' 2.6 पर हमेशा तेज है, 'इंटेप' हमेशा 2.7 पर तेज है और 'ज्वाइन' हमेशा पायथॉन 3.x पर तेज है।
# python2.6 concatenate_test.py
plus 0.338213920593 (100.00% as fast)
join 0.427221059799 (79.17% as fast)
form 0.515371084213 (65.63% as fast)
intp 0.378169059753 (89.43% as fast)
# python3.3 concatenate_test.py
plus 0.409130576998 (89.20% as fast)
join 0.364938726001 (100.00% as fast)
form 0.621366866995 (58.73% as fast)
intp 0.419064424001 (87.08% as fast)
# python3.4 concatenate_test.py
plus 0.481188605998 (85.14% as fast)
join 0.409673971997 (100.00% as fast)
form 0.652010936996 (62.83% as fast)
intp 0.460400978001 (88.98% as fast)
# python3.5 concatenate_test.py
plus 0.417167026084 (93.47% as fast)
join 0.389929617057 (100.00% as fast)
form 0.595661019906 (65.46% as fast)
intp 0.404455224983 (96.41% as fast)
सबक सीखा:
- कभी-कभी, मेरी धारणाएँ गलत हैं।
- सिस्टम के खिलाफ टेस्ट एन.वी. आप उत्पादन में भाग रहे होंगे।
- स्ट्रिंग प्रक्षेप अभी तक मरा नहीं है!
tl; डॉ:
- यदि आप 2.6 का उपयोग कर रहे हैं, तो + ऑपरेटर का उपयोग करें।
- यदि आप 2.7 का उपयोग कर रहे हैं तो '%' ऑपरेटर का उपयोग करें।
- यदि आप 3.x का उपयोग कर रहे हैं '' .join ()।