2010-10-18 7 views
6

Ich versuche, das Timeit-Modul zu verwenden, aber ich weiß nicht wie. Ich habe einen Haupt:Python timeit Problem

from Foo import Foo 
if __name__ == '__main__': 
... 
    foo = Foo(arg1, arg2) 
    t = Timer("foo.runAlgorithm()") 
    print t.timeit(2) 

und meine Klasse Foo ein Verfahren, wie runAlgorithm genannt hat()

der Fehler ist dies:

NameError: global name 'foo' is not defined

Was mache ich falsch? Kann ich mir die Zeit von einer Klassenmethode nehmen?

Antwort

16

Statt die notwendige setup parameter der Verwendung für die timeit Umgebung einrichten, können Sie einfach die Methode übergeben (oder alles, was aufrufbar ist):

t = Timer(foo.runAlgorithm) 

Aus der Dokumentation:

Changed in version 2.6: The stmt and setup parameters can now also take objects that are callable without arguments.

Wenn Sie einige Argumente zu übergeben müssen, können Sie Funktion mit functools.partial, zum Beispiel currying verwenden:

class C: 
    def printargs(self, a, b): 
     print a, b 

from functools import partial 
foo = C() 
t = Timer(partial(foo.printargs, 1, 2)) 
+1

Ich denke, * ohne Argumente * braucht – SilentGhost

+0

Nun hervorgehoben werden, wenn Sie Argumente übergeben müssen, können Sie einfach Verwenden Sie eine kleine Wrapper-Funktion. –

+0

@SilentGhost: Bearbeitet, um ein Beispiel * mit * Argumenten einzuschließen. – AndiDog

2

als docs example zeigen Sie setup Aussagen übergeben müssen:

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