अजगर दुभाषिया के लिए बैकटिक्स का क्या अर्थ है: `संख्या`


87

मैं सूची की समझ के साथ खेल रहा हूँ और मैं एक और साइट पर इस छोटे स्निपेट पर आया हूँ:

return ''.join([`num` for num in xrange(loop_count)])

मैंने कुछ मिनट बिताए, फंक्शन को दोहराने की कोशिश कर (टाइप करके) इससे पहले कि `num`बिट इसे तोड़ रहा था।

उन पात्रों में एक कथन को बताने से क्या होता है? मैं जो देख सकता हूं, वह str (संख्या) के बराबर है। लेकिन जब मैंने इसे समय दिया:

return ''.join([str(num) for num in xrange(10000000)])

यह 4.09s लेता है जबकि:

return ''.join([`num` for num in xrange(10000000)])

2.43s लेता है।

दोनों समान परिणाम देते हैं लेकिन एक बहुत धीमा है। यहाँ क्या हो रहा है?

संपादित करें: अजीब तरह से ... की repr()तुलना में थोड़ा धीमा परिणाम देता है `num`। २.९९ बनाम २.४३। पायथन 2.6 का उपयोग करना (अभी तक 3.0 की कोशिश नहीं की गई है)।


8
Skymind.com/~ocrow/python_string पर "एक और साइट" पढ़ने के बाद , मैंने एक समान प्रश्न किया था और इस पृष्ठ को पाया। अच्छा सवाल और अच्छा जवाब :)
netvope

जवाबों:


122

Backticks के लिए एक पदावनत उर्फ ​​हैं repr()। उन्हें और अधिक उपयोग न करें, पायथन 3.0 में वाक्यविन्यास हटा दिया गया था।

2.tx का उपयोग करने से repr(num)या num.__repr__()संस्करण 2.x से तेज प्रतीत होता है । मुझे लगता है कि वैश्विक नामस्थान (के लिए repr), या ऑब्जेक्ट के नामस्थान (के लिए __repr__) में क्रमशः अतिरिक्त शब्दकोश देखने की आवश्यकता है ।


disमॉड्यूल का उपयोग मेरी धारणा को साबित करता है:

def f1(a):
    return repr(a)

def f2(a):
    return a.__repr__()

def f3(a):
    return `a`

निराशाजनक शो:

>>> import dis
>>> dis.dis(f1)
  3           0 LOAD_GLOBAL              0 (repr)
              3 LOAD_FAST                0 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE
>>> dis.dis(f2)
  6           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (__repr__)
              6 CALL_FUNCTION            0
              9 RETURN_VALUE        
>>> dis.dis(f3)
  9           0 LOAD_FAST                0 (a)
              3 UNARY_CONVERT       
              4 RETURN_VALUE   

f1के लिए एक वैश्विक लुकअप repr, f2एक विशेषता लुकअप शामिल है __repr__, जबकि बैकटिक ऑपरेटर को एक अलग ओपकोड में लागू किया जाता है। चूंकि डिक्शनरी लुकअप ( LOAD_GLOBAL/ LOAD_ATTR) के लिए ओवरहेड नहीं है और न ही फंक्शन कॉल्स ( CALL_FUNCTION) के लिए, बैकटिक्स तेज हैं।

मुझे लगता है कि पायथन लोगों ने फैसला किया कि इसके लिए अलग-अलग निम्न-स्तरीय ऑपरेशन करना repr()इसके लायक नहीं है, और दोनों के पीछे होने repr()से सिद्धांत का उल्लंघन होता है

"एक होना चाहिए - और अधिमानतः ऐसा करने के लिए केवल एक ही - स्पष्ट तरीका"

इसलिए पायथन 3.0 में फीचर को हटा दिया गया था।


मैं खोजना चाहता था, आप कुछ फ़ंक्शन कॉल के साथ बैकटीक्स को कैसे बदल सकते हैं, लेकिन ऐसा लगता है कि यह संभव नहीं है, या यह है?
गिरि

2
बैकटिक्स के बजाय रीप () का उपयोग करें। Backticks repr () 3.0 के लिए मूल्यह्रास सिंटैक्स हैं। मैं वास्तव में बैकटिक्स के लुक को प्राथमिकता देता हूं, फिर ANOTHER फ़ंक्शन को कॉल करना।
डोमिनिक बू-समरा

8
Backticks के कारण वंचित कर रहे हैं भी 'चरित्र ही; यह (कुछ कीबोर्ड पर) टाइप करना कठिन हो सकता है, यह देखना मुश्किल है कि पायथन पुस्तकों में सही ढंग से प्रिंट करना मुश्किल है। आदि
u0b34a0f6ae

4
@ kaizer.se: यह इंगित करने के लिए धन्यवाद। यह शायद बैकटिक्स
फर्डिनेंट

मूल प्रश्न यह पोस्ट किया गया था, क्योंकि मैं वास्तव में अपने कीबोर्ड पर बैकटिक्स नहीं ढूंढ सका था;) टिल्ड के नीचे यह googling के बाद लगता है।
डोमिनिक बाउ-समरा

10

बैकटिक उद्धरण आम तौर पर गैर-उपयोगी है और पायथन 3 में चला गया है।

इसके लायक क्या है, यह:

''.join(map(repr, xrange(10000000)))

मेरे लिए backtick संस्करण की तुलना में थोड़ा तेज है। लेकिन इस बारे में चिंता करना शायद समय से पहले का अनुकूलन है।


2
एक कदम पीछे की ओर क्यों जाएं और सूची / पुनरावृत्त समझ के बजाय मानचित्र का उपयोग करें?
निको

4
वास्तव में, (की तुलना में भी बदतर ) के लिए के timeitलिए तेजी से परिणाम देता ''.join(map(repr, xrange(0, 1000000)))है । यह थोड़ा निराशाजनक है ;-)''.join([repr(i) for i in xrange(0, 1000000)])''.join( (repr(i) for i in xrange(0, 1000000)) )
RedGlyph 11

8
बॉबिन का परिणाम मेरे लिए आश्चर्य की बात नहीं है। अंगूठे के नियम के रूप में, पायथन में निहित लूप स्पष्ट लोगों की तुलना में तेज होते हैं, अक्सर नाटकीय रूप से तेज होते हैं। mapC में कार्यान्वित किया जाता है, C लूप का उपयोग करके, जो वर्चुअल मशीन में निष्पादित पायथन लूप की तुलना में बहुत तेज है।
फर्डिनेंड बेयर 12

7
आश्चर्य की बात नहीं है, यह सूची की समझ की प्रतिष्ठा के लिए बहुत बुरा है (इस उदाहरण में 30% हिट के साथ)। लेकिन मैं जब तक यह वास्तव में महत्वपूर्ण है, तब तक धधकते गति कोड की तुलना में स्पष्ट है, इसलिए यहाँ कोई बड़ी बात नहीं है। यह कहा जा रहा है, नक्शा () फ़ंक्शन मुझे अस्पष्ट के रूप में हड़ताल नहीं करता है, एलसी कभी-कभी ओवररेटेड होते हैं।
RedGlyph

4
mapमुझे पूरी तरह से स्पष्ट और संक्षिप्त लगता है, और मैं पायथन को भी नहीं जानता।
Zenexer

1

मेरा अनुमान है कि num यह विधि परिभाषित नहीं करती है __str__(), इसलिए str()इसके लिए दूसरी खोज करनी होगी __repr__

बैकटिक्स सीधे देखने के लिए __repr__। यदि यह सच है, तो repr()बैकटिक्स के बजाय का उपयोग करके आपको समान परिणाम देना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.