Die Meldung "global name 'foo' ist nicht definiert" mit Pythons timeit
Ich versuche, herauszufinden, wie viel Zeit es braucht, um führen Sie eine Python-Anweisung, also suchte ich online und fand, dass die standard-Bibliothek bietet ein Modul namens timeit, die vorgibt, genau das zu 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()
Jedoch, dies produziert 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 noch neu in Python und verstehe ich nicht alle der scoping-Probleme hat, aber ich weiß nicht, warum dieses snippet funktioniert nicht. Irgendwelche Gedanken?
InformationsquelleAutor Kyle Cronin | 2009-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern Sie diese Zeile:
:
Check den link, den Sie ganz unten.
Habe es gerade getestet auf meinem Rechner und es funktionierte mit den änderungen.
Python-Verwendung von Namensräumen ist völliger Wahnsinn für mich. Ich gehe davon aus, dass es Sinn macht auf eine bestimmte Art des Geistes, aber diese Art von Geist ist nicht eine, die ich zufällig Schutzbedarf. Danke $GOTTHEIT für Ruby, in meinem Fall.
womble, das ist eine Warze, nicht eine Allgemeine python namespace problem. Haupt-thread: writeonly.wordpress.com/2008/09/12/... links zu anderen Diskussionen über diese.
Der link ist nicht mehr erreichbar (Fehler 404). Was war in dieser Diskussion?
diese links sind alle tot
InformationsquelleAutor Paolo Bergantino
Können Sie versuchen, diese hacken:
Besser als die startup-code, alternativ in anderen Antworten (also besser als
t = timeit.Timer("foo()", "from __main__ import foo")
). Speziell wenn Sie testen wollen, verschiedene Funktionen, es spart eine Menge Tipparbeit!Ich habe über 20 Importe, so übergeben Sie Sie als argument bekommt unordentlich schnell. Dieser hack ist genial!
Super!!! Auf Python ist3 allerdings müssen Sie
import builtins
und " gelieferten.__dict__.update(locals())'InformationsquelleAutor Luka Zakrajšek
Mit Python 3 können Sie
globals=globals()
Aus der Dokumentation:
globals
kein parameter für Python 2timeit
InformationsquelleAutor user2314737
Seit timeit nicht Ihre Sachen in scope.
InformationsquelleAutor dwc
fügen Sie in Ihr setup "import diesedatei; "
dann beim Aufruf der setup-Funktion myfunc() verwenden "diesedatei.myfunc()"
zB "thisfile.py"
InformationsquelleAutor mist42nz