2010-10-18 14 views
6

Estoy tratando de usar el módulo timeit pero no sé cómo. tengo una principal:Python problema de tiempo

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

y mi clase Foo tiene un método denominado como runAlgorithm()

el error es la siguiente:

NameError: global name 'foo' is not defined

¿Qué estoy haciendo mal? ¿Puedo tomar el tiempo de un método de clase?

Respuesta

16

En lugar de utilizar la necesaria setup parameter para la configuración del entorno timeit, usted puede simplemente pasar el método (o cualquier cosa que sea exigible):

t = Timer(foo.runAlgorithm) 

De la documentación:

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

Si necesita pasar algunos argumentos, que pueden funcionar currying con functools.partial utilizar, por ejemplo:

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

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

pienso * sin argumentos * tiene que ser destacado – SilentGhost

+0

Bueno, si usted necesita para pasar argumentos, simplemente podría use una función de envoltura pequeña. –

+0

@SilentGhost: editado para incluir un ejemplo * con * argumentos. – AndiDog

2

como docs example muestran que necesita para pasar setup declaraciones:

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