यदि मैं बहुत लंबी सूची में लेन () को कॉल करता रहता हूं, तो क्या मैं समय बर्बाद कर रहा हूं, या क्या यह पृष्ठभूमि में एक इंट काउंट रखता है?
यदि मैं बहुत लंबी सूची में लेन () को कॉल करता रहता हूं, तो क्या मैं समय बर्बाद कर रहा हूं, या क्या यह पृष्ठभूमि में एक इंट काउंट रखता है?
जवाबों:
चिंता न करें: बेशक यह गिनती बचाता है और इस प्रकार len()सूचियों पर एक बहुत सस्ता ऑपरेशन है। उसी तरह से तार, शब्दकोश और सेट के लिए सच है!
और यह पता लगाने का एक और तरीका है कि यह कैसे किया जाता है Google कोड खोज पर इसे देखने के लिए GitHub पर स्रोत को देखें , यदि आप स्रोत को स्वयं डाउनलोड नहीं करना चाहते हैं।
static Py_ssize_t list_length(PyListObject *a)
{
return a->ob_size;
}
अपना कार्यक्रम लिखें ताकि यह स्पष्टता के लिए अनुकूलित हो और आसानी से बनाए रखा जा सके । क्या आपका कार्यक्रम एक कॉल के साथ स्पष्ट है len(foo)? फिर वह करें।
क्या आपको समय लगने की चिंता है? लिया गया समय मापने के लिए timeitमानक पुस्तकालय में मॉड्यूल का उपयोग करें , और देखें कि क्या यह आपके कोड में महत्वपूर्ण है।
आप ज्यादातर लोगों की तरह, आपके अनुमानों में गलत होंगे कि आपके कार्यक्रम के कौन से हिस्से सबसे धीमे हैं। अनुमान लगाने के प्रलोभन से बचें, और इसके बजाय यह पता लगाने के लिए मापें।
याद रखें कि समयपूर्व अनुकूलन सभी बुराई की जड़ है , डोनाल्ड नथ के शब्दों में। केवल उस कोड की गति पर ध्यान केंद्रित करें जो आपने की गति को मापा है, यह जानने के लिए कि क्या यह काम करने की लागत को बदलने के लायक होगा या नहीं।
प्रश्न का उत्तर दिया गया है ( lenहे (1)), लेकिन यहां बताया गया है कि आप अपने लिए कैसे जांच सकते हैं:
$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop
हाँ, वास्तव में धीमी नहीं है।
इसकी लंबाई कहीं स्टोर करनी होती है, इसलिए आप हर बार आइटम की संख्या नहीं गिन रहे हैं।