2012-06-04 12 views
5

मैं उसी पायथन मॉड्यूल में कई फ़ंक्शन लिखना चाहता हूं, जिनमें से प्रत्येक timeit का उपयोग करके एक अलग प्रोफाइलिंग परीक्षण है, ताकि मैं निर्दिष्ट करने के लिए कमांड लाइन तर्क का उपयोग कर सकूं एक चलाने के लिए। एक अनुभवहीन उदाहरण (profiling.py) होगा:क्या हम एक ही मॉड्यूल में टाइमिट के साथ प्रत्येक कार्य को चला सकते हैं

import sys 
import timeit 

def foo(): 

    setup = """ 
    import random 
    """ 

    foo_1 = """ 
    for i in range(1000): 
     random.randint(0, 99) + random.randint(0, 99) 
    """ 

    foo_2 = """ 
    for i in range(1000): 
     random.randint(0, 99) + random.randint(0, 99) 
    """ 

    foo_3 = """ 
    for i in range(1000): 
     random.randint(0, 99) + random.randint(0, 99) 
    """ 

    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000) 
    print 'foo_2', timeit.Timer(foo_2, setup).timeit(1000) 
    print 'foo_3', timeit.Timer(foo_3, setup).timeit(1000) 

if __name__ == '__main__': 
    if (len(sys.argv) > 1): 
     if (sys.argv[1] == 'foo'): 
      foo() 
    else: 
     print 'Which profiling do you want to run?' 
     print 'available:' 
     print ' foo' 

हालांकि, जब मैं python profiling.py foo कोशिश, मैं त्रुटि की तरह मिलता है निम्नलिखित:

foo_1 
Traceback (most recent call last): 
    File "profiling.py", line 32, in <module> 
    foo() 
    File "profiling.py", line 25, in foo 
    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/timeit.py", line 136, in __init__ 
    code = compile(src, dummy_src_name, "exec") 
    File "<timeit-src>", line 6 
    _t0 = _timer() 
       ^
IndentationError: unindent does not match any outer indentation level 

मैं हमेशा की तरह अंतरिक्ष/टैब दांतेदार बनाना त्रुटि के लिए खोज की है कोड में, लेकिन कोई नहीं मिला। इसलिए मुझे आश्चर्य है कि ऐसा इसलिए है क्योंकि मैं एक फ़ंक्शन के अंदर timeit परीक्षण लपेटता हूं, और इसकी अनुमति नहीं है?

+1

क्या होता है यदि आप समय-समय पर चल रहे तारों से व्हाइटस्पेस को हटाते हैं? (उदाहरण के लिए 'foo_1 = "i श्रेणी में (1000): \ n random.randint (0, 99) + random.randint (0, 99)" ') – mgilson

+0

क्या आपने किसी भी मौके से उस पंक्ति को कॉपी और पेस्ट किया था? कई बार जब आप कॉपी और पेस्ट करते हैं तो आपको मेल खाने वाले टैब आकार या टैब को सफेद-रिक्त स्थान के कारण उस त्रुटि का सामना करना पड़ेगा। सुझाव के लिए –

उत्तर

7

यह काम करता है:

import sys 
import timeit 

def foo(): 

    setup = """ 
import random 
""" 

    foo_1 = """ 
for i in range(1000): 
    random.randint(0, 99) + random.randint(0, 99) 
""" 

    foo_2 = """ 
for i in range(1000): 
    random.randint(0, 99) + random.randint(0, 99) 
""" 

    foo_3 = """ 
for i in range(1000): 
    random.randint(0, 99) + random.randint(0, 99) 
""" 

    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000) 
    print 'foo_2', timeit.Timer(foo_2, setup).timeit(1000) 
    print 'foo_3', timeit.Timer(foo_3, setup).timeit(1000) 

if __name__ == '__main__': 
    if (len(sys.argv) > 1): 
     if (sys.argv[1] == 'foo'): 
      foo() 
    else: 
     print 'Which profiling do you want to run?' 
     print 'available:' 
     print ' foo' 

समस्या यह है कि अपने तार कि आप setup और foo_1, आदि के रूप में गुजर रहे हैं इंडेंट कर रहे हैं के बाद से आप उन्हें समारोह के अंदर अपने दांतेदार कोड के साथ खड़े है । हालांकि, जब उस स्ट्रिंग को timeit द्वारा निष्पादित किया जाता है, तो यह आपके द्वारा देखी गई इंडेंटेशन त्रुटि को बढ़ाता है क्योंकि कोड को इंडेंट नहीं किया जाना चाहिए। यह अनिवार्य रूप से वही बात है जो आपने कोशिश की होगी ...

exec(" import sys") 

आपके इंटरैक्टिव दुभाषिया सत्र में पहली चीज़ के रूप में।

+0

धन्यवाद। तो मैं 'setup = "" "आयात यादृच्छिक" "" '(सभी एक पंक्ति में), ** ** बिना ** foo_1 में कोई भी परिवर्तन कर त्रुटि को ठीक कर सकता हूं। मुझे आश्चर्य है क्योंकि? – MLister

+0

'timeit' को चलाने के लिए तर्क पर कुछ" सफाई "करना चाहिए, लेकिन सेटअप-कोड पर नहीं। – mgilson

+0

@MLister इसके बारे में क्या मजाकिया है? आपके सेटअप कोड के सामने आपके पास कोई इंडेंटेशन नहीं है - केवल एक नई लाइन (रिक्त रेखाएं अजगर में पूरी तरह से स्वीकार्य हैं)। – mgilson

0

mgilson ने एक अच्छा जवाब दिया। लेकिन व्यक्तिगत रूप से, मुझे हेड्रोक स्ट्रिंग्स विचलित करने में दृष्टिहीन-समर्पित रेखाएं मिलती हैं। यह the vim python code folding I use भी तोड़ता है।

आप लाइनों को अलग से लिखना, और शामिल होने के लिए उन्हें, इसलिए तरह से एक ही प्रभाव प्राप्त कर सकते हैं:

import sys 
import timeit 


def foo(): 

    setup = 'import random' 

    foo_1 = '\n'.join([ 
     'for i in range(1000):', 
     ' random.randint(0, 99) + random.randint(0, 99)', 
    ]) 

    foo_2 = '\n'.join([ 
     'for i in range(1000):', 
     ' random.randint(0, 99) + random.randint(0, 99)', 
    ]) 

    foo_3 = '\n'.join([ 
     'for i in range(1000):', 
     ' random.randint(0, 99) + random.randint(0, 99)', 
    ]) 

    print 'foo_1', timeit.Timer(foo_1, setup).timeit(1000) 
    print 'foo_2', timeit.Timer(foo_2, setup).timeit(1000) 
    print 'foo_3', timeit.Timer(foo_3, setup).timeit(1000) 

if __name__ == '__main__': 
    if (len(sys.argv) > 1): 
     if (sys.argv[1] == 'foo'): 
      foo() 
    else: 
     print 'Which profiling do you want to run?' 
     print 'available:' 
     print ' foo' 

आप प्रत्येक पंक्ति पर कम जगह मिलता है, लेकिन मैं संतुलित महत्व यह मेरे लिए है।

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