2010-10-18 14 views
6

J'essaie d'utiliser le module timeit mais je ne sais pas comment. J'ai principale:Problème de temps de Python

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

et ma classe Foo a une méthode nommée comme runAlgorithm()

l'erreur est la suivante:

NameError: global name 'foo' is not defined

Qu'est-ce que je fais mal? Puis-je prendre le temps d'une méthode de classe?

Répondre

16

Au lieu d'utiliser le setup parameter nécessaire à la mise en place de l'environnement timeit, vous pouvez tout simplement passer la méthode (ou tout ce qui est appelable):

t = Timer(foo.runAlgorithm) 

De la documentation:

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

Si vous avez besoin de passer quelques arguments, vous pouvez utiliser la fonction taitement avec functools.partial, par exemple:

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

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

Je pense * sans arguments * doit être mis en évidence – SilentGhost

+0

Eh bien, si vous avez besoin de passer des arguments, vous pouvez simplement utiliser une petite fonction d'enveloppe. –

+0

@SilentGhost: Edité pour inclure un exemple * avec * arguments. – AndiDog

2

comme docs example vous montrer devez passer setup déclarations:

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