क्योंकि एक एल्गोरिदम मैं लागू करना चाहता हूं, सूचकांक 1..n
का उपयोग करता है और क्योंकि प्रत्येक सूचकांक को एक-एक करके स्थानांतरित करने में बहुत त्रुटि होती है, मैंने स्मार्ट प्राप्त करने और एक डमी तत्व डालने का निर्णय लिया प्रत्येक सूची की शुरुआत, इसलिए मैं कागज से मूल सूत्रों का उपयोग कर सकता हूं।पीपीपी: पूर्णांक के साथ किसी भी सूची में किसी भी का उपयोग करते समय गंभीर प्रदर्शन दंड
तकलीफ के लिए, इस खिलौने उदाहरण पर विचार करें:
def calc(N):
nums=[0]+range(1,N+1)
return sum(nums[1:]) #skip first element
हालांकि, मैं चिंतित हो गया, कि मेरे परिणाम नकली कर रहे हैं, क्योंकि मैं कहीं दुर्घटना से 0-वें तत्व यहां पहुंच सकता है और नहीं बारे में पता होना इसका इसलिए मैं भी बेहतर हो गया है और पहले तत्व के रूप में None
बजाय 0
इस्तेमाल किया - इसके साथ हर अंकगणितीय संचालन एक रनटाइम त्रुटि में परिणाम होगा: भी
def calc_safe(N):
nums=[None]+range(1,N+1) #here we use "None"
return sum(nums[1:])
हैरानी की बात है, इस छोटे से परिवर्तन PyPy के लिए एक बड़ा प्रदर्शन की सजा के लिए नेतृत्व किया (वर्तमान 5.8 संस्करण के साथ) - कोड लगभग 10 गुना धीमा हो गया!
pypy-5.8 cpython
calc(10**8) 0.5 sec 5.5 sec
calc_safe(10**8) 7.5 sec 5.5 sec
एक पक्ष नोड के रूप में:: यहाँ मेरी मशीन पर समय है CPython, परवाह नहीं करता None
या नहीं किया जाता है या नहीं।
तो मेरे सवाल दोहरा है:
- जाहिर है का उपयोग कर
None
एक अच्छा विचार नहीं है, लेकिन क्यों? - क्या
None
-approach की सुरक्षा प्राप्त करना और प्रदर्शन जारी रखना संभव है?
संपादित करें: आर्मिन के रूप में विस्तार से बताया गया है, नहीं सभी सूचियों के बराबर हैं, और हम देख सकते हैं, जो रणनीति के माध्यम से किया जाता है:
import __pypy__
print __pypy__.strategy(nums)
पहले मामले में यह IntegerListStrategy
है और दूसरे में ObjectListStrategy
। ऐसा ही होगा यदि हमने None
के बजाय एक बड़ा पूर्णांक मान (जैसे 2**100
) का उपयोग किया।
यह किसी भी तरह संभव स्पष्ट रूप से देखने के लिए, अनुकूलित या सूची की गैर-अनुकूलित संस्करण प्रयोग किया जाता है कि क्या है? – ead
हां, '' __pypy __। रणनीति (एलएसटी) '' के साथ। –