2017-02-07 15 views
17

समस्या विवरण:सही बनाम CPython प्रदर्शन PyPy परीक्षण

मैं इस प्रथा है "चेकसम" समारोह:

NORMALIZER = 0x10000 


def get_checksum(part1, part2, salt="trailing"): 
    """Returns a checksum of two strings.""" 

    combined_string = part1 + part2 + " " + salt if part2 != "***" else part1 
    ords = [ord(x) for x in combined_string] 

    checksum = ords[0] # initial value 

    # TODO: document the logic behind the checksum calculations 
    iterator = zip(ords[1:], ords) 
    checksum += sum(x + 2 * y if counter % 2 else x * y 
        for counter, (x, y) in enumerate(iterator)) 
    checksum %= NORMALIZER 

    return checksum 

कौन सा मैं दोनों Python3.6 और PyPy प्रदर्शन के लिहाज से पर परीक्षण करना चाहते हैं । मैं देखना चाहता हूं कि समारोह पीपीपी पर बेहतर प्रदर्शन करेगा, लेकिन मुझे पूरा यकीन नहीं है कि यह करने के लिए सबसे विश्वसनीय और साफ तरीका क्या है।

मैं क्या कोशिश की है और प्रश्न:

वर्तमान में, मैं दोनों के लिए timeit उपयोग कर रहा हूँ:

$ python3.6 -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)" 
10 loops, best of 3: 329 msec per loop 

$ pypy -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)" 
10 loops, best of 3: 104 msec per loop 

मेरी चिंता का विषय मैं बिल्कुल यकीन है कि अगर timeit सही है नहीं कर रहा हूँ है की वजह से PyPy पर नौकरी के लिए टूल।

WARNING: timeit is a very unreliable tool. use perf or something else for real measurements 
pypy -m pip install perf 
pypy -m perf timeit -s 'from test import get_checksum' "get_checksum('test1' * 1000000, 'test2' * 1000000)" 

क्या सबसे अच्छा और सबसे सटीक दृष्टिकोण इन भर में एक ही सटीक समारोह प्रदर्शन और संभवत: अन्य अजगर कार्यान्वयन परीक्षण करने के लिए किया जाएगा:

इसके अलावा, PyPy ही परीक्षण के परिणाम रिपोर्ट करने से पहले निम्न रिपोर्ट?

+2

बिल्कुल करता है कि परीक्षण (समय) कुछ भी? ऐसा लगता है कि आप केवल एक सेटअप करते हैं और कोई वास्तविक परीक्षण कमांड नहीं करते हैं? – MSeifert

+0

@MSeifert आह, मैं मूर्ख हूँ, आप बिल्कुल सही हैं। वहां केवल वहां स्थापित किया गया था, मैंने प्रश्न के बाद के हिस्से को छोड़कर उत्तर अपडेट किया है। धन्यवाद! – alecxe

उत्तर

3

आप समय सटीकता में सुधार के लिए --repeat पैरामीटर के साथ पुनरावृत्ति की संख्या बढ़ा सकते हैं। देखें:

https://docs.python.org/2/library/timeit.html

2

यह पूरी तरह स्पष्ट है कि तुम क्या मापने के लिए कोशिश कर रहे हैं नहीं है। "प्रदर्शन" का मतलब आपके उपयोग-मामले के आधार पर विभिन्न प्रकार की चीजें हो सकता है।

  • क्या आप सबकुछ गर्म होने के बाद फ़ंक्शन की कच्ची गति को मापने की कोशिश कर रहे हैं (विशेष रूप से जेआईटी लेकिन पुस्तकालय आयात, फ़ाइल लोडिंग आदि ...)? तो शायद आप --repeat को Haroldo_OK सुझाए गए बहुत कुछ करना चाहते हैं। पर्याप्त पुनरावृत्ति के साथ, आपके कोड के अन्य हिस्सों में बिताए गए समय क्रमशः "महत्वहीन" बन जाएंगे।
  • क्या आप सीखने के लिए या असली दुनिया के उपयोग के मामले के लिए चीजों को माप रहे हैं? यदि उत्तरार्द्ध, संभवतः आपके कोड को समान स्थितियों के तहत परीक्षण करना एक अच्छा विचार है (तारों की लंबाई जो आप अपने कार्य में गुजर रहे हैं, पुनरावृत्तियों की संख्या, आपके कोड की गर्म/ठंडी कॉलिंग ...)। मेरी धारणा यह है कि सीएलआई के बजाय python interface का उपयोग करके आप जो भी कर रहे हैं उसे मापने के लिए आपको अधिक लचीलापन प्रदान करेंगे।
ध्यान दें, timeit turns off garbage collection के

, इसलिए यदि आप "वास्तविक दुनिया" मापन के लिए देख रहे हैं, हो सकता है आप इसे पुन: चालू करने (इसे कैसे करना के लिए लिंक देखें) चाहते हैं।

यदि आप गति को बेहतर बनाने की कोशिश कर रहे हैं, तो cProfile जैसे प्रोफाइलर का उपयोग करके जो कि Python3.6 और pypy दोनों द्वारा समर्थित है, उस कोड को अलग करने में मदद कर सकता है जिसकी गति आप मापना चाहते हैं?

मैं वास्तव में अपने प्रश्न का जवाब दे नहीं हूँ, लेकिन मुझे आशा है कि यह मदद करता है :)

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