Frage Getting "globalen Namen 'foo' ist nicht definiert" mit Python's Zeit


Ich versuche herauszufinden, wie viel Zeit es dauert, eine Python-Anweisung auszuführen, also habe ich online gesucht und festgestellt, dass die Standardbibliothek ein Modul namens Zeit das soll genau das tun:

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()

Dies erzeugt jedoch einen Fehler:

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

Ich bin immer noch neu bei Python und verstehe nicht alle Scoping-Probleme, die es hat, aber ich weiß nicht, warum dieses Snippet nicht funktioniert. Irgendwelche Gedanken?


76
2018-02-15 23:15


Ursprung


Antworten:


Ändern Sie diese Zeile:

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

Zu diesem:

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

Schau dir den Link an, den du ganz unten angegeben hast.

Um dem Modul timeit Zugriff auf Funktionen zu geben, die Sie definieren, können Sie einen Setup-Parameter übergeben, der eine import-Anweisung enthält:

Ich habe es gerade auf meiner Maschine getestet und es hat mit den Änderungen funktioniert.


83
2018-02-15 23:18



Sie können diesen Hack versuchen:

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()

19
2018-03-22 11:16



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

Da Timeiit deine Sachen nicht in Reichweite hat.


8
2018-02-15 23:22



Sie können verwenden globals=globals() 

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

Von dem Dokumentation:

Eine andere Möglichkeit besteht darin, zu bestehen globals() zum globals Parameter, der   bewirkt, dass der Code in Ihrem aktuellen globalen Code ausgeführt wird   Namensraum. Dies kann bequemer sein als die individuelle Angabe   Importe


7
2017-09-05 12:51



füge in dein Setup "import thisfile;"

dann, wenn Sie die Setup-Funktion myfunc () aufrufen, verwenden Sie "thisfile.myfunc ()"

zB "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 )

0
2018-06-01 22:45