2017-07-11 7 views
7

क्योंकि एक एल्गोरिदम मैं लागू करना चाहता हूं, सूचकांक 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 या नहीं किया जाता है या नहीं।

तो मेरे सवाल दोहरा है:

  1. जाहिर है का उपयोग कर None एक अच्छा विचार नहीं है, लेकिन क्यों?
  2. क्या None -approach की सुरक्षा प्राप्त करना और प्रदर्शन जारी रखना संभव है?

संपादित करें: आर्मिन के रूप में विस्तार से बताया गया है, नहीं सभी सूचियों के बराबर हैं, और हम देख सकते हैं, जो रणनीति के माध्यम से किया जाता है:

import __pypy__ 
print __pypy__.strategy(nums) 

पहले मामले में यह IntegerListStrategy है और दूसरे में ObjectListStrategy। ऐसा ही होगा यदि हमने None के बजाय एक बड़ा पूर्णांक मान (जैसे 2**100) का उपयोग किया।

उत्तर

4

पीईपीई को केवल पूर्णांक वाले सूचियों के लिए एक विशेष मामला मिला है --- यह उन्हें array.array की तरह स्टोर करता है। यदि इसमें कोई नहीं है, तो यह अनुकूलन अब काम नहीं करता है।

यह शायद PyPy के अंदर तय किया जा सकता है एक विशेष मामले के रूप में कोई भी अनुमति देने के लिए ...

+0

यह किसी भी तरह संभव स्पष्ट रूप से देखने के लिए, अनुकूलित या सूची की गैर-अनुकूलित संस्करण प्रयोग किया जाता है कि क्या है? – ead

+0

हां, '' __pypy __। रणनीति (एलएसटी) '' के साथ। –

संबंधित मुद्दे