पायथन के समय के साथ "वैश्विक नाम 'फू' को परिभाषित नहीं किया गया है


92

मैं यह जानने की कोशिश कर रहा हूं कि पायथन स्टेटमेंट को निष्पादित करने में कितना समय लगता है, इसलिए मैंने ऑनलाइन देखा और पाया कि मानक पुस्तकालय टाइमटाइम नामक एक मॉड्यूल प्रदान करता है जो वास्तव में ऐसा करने का उद्देश्य रखता है:

import timeit

def foo():
    # ... contains code I want to time ...

def dotime():
    t = timeit.Timer("foo()")
    time = t.timeit(1)
    print "took %fs\n" % (time,)

dotime()

हालाँकि, यह एक त्रुटि उत्पन्न करता है:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in dotime
  File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: global name 'foo' is not defined

मैं अभी भी पायथन के लिए नया हूं और मेरे पास इसके लिए सभी स्कोपिंग मुद्दे नहीं हैं, लेकिन मुझे नहीं पता कि यह स्निपेट काम क्यों नहीं करता है। कोई विचार?

जवाबों:


93

इस पंक्ति को बदलें:

t = timeit.Timer("foo()")

इसके लिए:

t = timeit.Timer("foo()", "from __main__ import foo")

बहुत नीचे दिए गए लिंक को देखें।

आपके द्वारा परिभाषित कार्यों को टाइमटाइम मॉड्यूल एक्सेस देने के लिए, आप एक सेटअप पैरामीटर पास कर सकते हैं जिसमें एक आयात विवरण होता है:

मैंने सिर्फ अपनी मशीन पर इसका परीक्षण किया और इसने परिवर्तनों के साथ काम किया।


28
यह काम करता हैं! हालाँकि, यह एक बहुत ही बेवकूफाना इंटरफ़ेस डिज़ाइन है अगर मुझे दोनों को कमांड की आपूर्ति करनी है जिसे मैं एक स्ट्रिंग के रूप में समय देना चाहता हूं और इसके लिए मुख्य मॉड्यूल को काम करना है।
काइल क्रोनिन

2
पायथन नामस्थान मेरे लिए बिल्कुल पागलपन है। मुझे लगता है कि यह एक निश्चित प्रकार के मन के लिए समझ में आता है, लेकिन उस तरह का मन वह नहीं है जो मैं बन गया हूं। रूबी के लिए $ DEITY का धन्यवाद, मेरे मामले में।
वोमबेल

5
womble, यह एक मस्सा है, सामान्य अजगर नाम स्थान की समस्या नहीं है। मुख्य सूत्र: writeonly.wordpress.com/2008/09/12/… में इस बारे में अन्य चर्चाओं के लिंक हैं।
ग्रीग लिंड

1
@Gregg लिंक अब उपलब्ध नहीं है (त्रुटि 404)। उस चर्चा में क्या था?
ओवगोलोविन

2
वे लिंक सभी मृत हैं
एंडोलिथ

25

पायथन 3 के साथ, आप उपयोग कर सकते हैं globals=globals()

t = timeit.Timer("foo()", globals=globals())

से प्रलेखन :

एक अन्य विकल्प पैरामीटर को पास globals()करना है globals, जिससे कोड आपके वर्तमान वैश्विक नामस्थान के भीतर निष्पादित हो जाएगा। यह आयातों को व्यक्तिगत रूप से निर्दिष्ट करने की तुलना में अधिक सुविधाजनक हो सकता है


3
केवल पायथन 3 के लिए काम करता है। globalsअजगर 2 के लिए एक पैरामीटर नहींtimeit
tony_tiger

21

आप इस हैक की कोशिश कर सकते हैं:

import timeit

def foo():
    print 'bar'

def dotime():
    t = timeit.Timer("foo()")
    time = t.timeit(1)
    print "took %fs\n" % (time,)

import __builtin__
__builtin__.__dict__.update(locals())

dotime()

1
यदि आपको अन्यथा जटिल सेटअप कोड की आवश्यकता हो तो यह हैक बहुत अच्छा है।
लूइस मार्क्स

अन्य उत्तरों में दिए गए स्टार्टअप कोड विकल्प से बेहतर (यानी इससे बेहतर t = timeit.Timer("foo()", "from __main__ import foo"))। विशेष रूप से यदि आप कई अलग-अलग कार्यों का परीक्षण करना चाहते हैं, तो यह बहुत सारे टाइपिंग को बचाएगा!
सोमरह

1
मुझे लगभग 20 आयात मिले हैं, इसलिए उन्हें एक तर्क के रूप में पारित करने से गड़बड़ हो जाती है। ये हैक कमाल का है!
kramer65

7
महान! Python3 पर फिर भी आपको जरूरत है import builtinsऔर ' बिल्डिंस .__ तानाशाही __। अद्यतन (स्थानीय) ()'
greole

क्या आप समय () फ़ंक्शन में कई कार्य कर सकते हैं?
edo101

8
t = timeit.Timer("foo()", "from __main__ import foo")

चूँकि timeit में आपका सामान नहीं है।


0

अपने सेटअप में जोड़ें "यह आयात आयात करें;"

तब जब आप सेटअप फंक्शन myfunc () का उपयोग करते हैं "itfile.myfunc ()"

उदाहरण के लिए "thisfile.py"

def myfunc():

 return 5

def testable(par):

 pass



t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)

print( t )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.