python - पायथन में स्ट्रिंग कन्टेनटेनेशन




compilation internals (2)

क्या आप स्ट्रिंग संयोजन के दो तरीकों के बीच अंतर का वर्णन कर सकते हैं: सरल __add__ ऑपरेटर और %s पैटर्न? इस प्रश्न में मुझे कुछ जांच हुई और %s (कोष्ठकों का उपयोग किए बिना) थोड़ी तेज़ी से मिला।

इसके अलावा एक अन्य प्रश्न भी सामने आया: 'hell%s' % 'o' का परिणाम 'hell%s' % 'o' 'hell%s' % ('o',) तुलना में किसी अन्य स्मृति क्षेत्र को संदर्भित करता है?

कुछ कोड उदाहरण है:

l = ['hello', 'hell' + 'o', 'hell%s' % 'o', 'hell%s' % ('o',)]
print [id(s) for s in l]

परिणाम:

[34375618400, 34375618400, 34375618400, 34375626256]

पी एस मैं स्ट्रिंग interning के बारे में पता :)


यहां एक छोटा व्यायाम है:

>>> def f1():
    'hello'


>>> def f2():
    'hel' 'lo'


>>> def f3():
    'hel' + 'lo'


>>> def f4():
    'hel%s' % 'lo'


>>> def f5():
    'hel%s' % ('lo',)


>>> for f in (f1, f2, f3, f4, f5):
    print(f.__name__)
    dis.dis(f)


f1
  1           0 LOAD_CONST               1 (None) 
              3 RETURN_VALUE         
f2
  1           0 LOAD_CONST               1 (None) 
              3 RETURN_VALUE         
f3
  2           0 LOAD_CONST               3 ('hello') 
              3 POP_TOP              
              4 LOAD_CONST               0 (None) 
              7 RETURN_VALUE         
f4
  2           0 LOAD_CONST               3 ('hello') 
              3 POP_TOP              
              4 LOAD_CONST               0 (None) 
              7 RETURN_VALUE         
f5
  2           0 LOAD_CONST               1 ('hel%s') 
              3 LOAD_CONST               3 (('lo',)) 
              6 BINARY_MODULO        
              7 POP_TOP              
              8 LOAD_CONST               0 (None) 
             11 RETURN_VALUE         

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


% का उपयोग करना, तकनीकी रूप से बोलना, स्ट्रिंग फ़ॉर्मेटिंग , सम्मिलन नहीं है। वे दो पूरी तरह से * अलग दुनिया हैं

यदि आप स्ट्रिंग इंटर्निंग के बारे में जानते हैं तो आपको पता होना चाहिए कि इसमें बिल्कुल कोई गारंटी नहीं है कि दो स्ट्रिंग्स उसी मेमोरी को दूसरे के रूप में बिताएंगे तथ्य यह है कि आपके उदाहरण में पहले तीन क्या शुद्ध संयोग से ज्यादा कुछ नहीं है।

मैं 100% निश्चित नहीं हूँ कि स्ट्रिंग फ़ॉर्मेटिंग कैसे काम करता है, लेकिन मुझे पता है कि अंतर्निहित सी में ''.join(sequence) को समान रूप से कार्यान्वित नहीं किया गया है - मुझे लगता है कि यह ''.join(sequence) की तर्ज पर थोड़ी अधिक काम करता है, जो भी है बड़ी तारों के लिए + तुलना में तेज - अधिक जानकारी के लिए इस पोस्ट को देखें

*की तरह।







object-identity