Quiero saber cuánto tiempo tarda una importación tanto en los módulos integrados como en los definidos por el usuario.Tiempo que tarda una importación en Python
Respuesta
Puede probar esta runnning
$ time python -c "import math"
Sin embargo, lo que haría que esta ayuda? La importación solo ocurre una vez y casi nunca será un cuello de botella. Importar el mismo módulo una y otra vez no será mucho más lento que importarlo una vez, ya que Python rastrea qué módulos ya se han importado.
¿Qué estás tratando de lograr?
Tengo un script maestro que importa otros módulos. Necesito calcular cuánto tiempo toma – user46646
@rejinacm: Actualice su pregunta con nuevos datos. –
uso de perfiles: http://docs.python.org/library/profile.html
De todos modos, las importaciones se almacenan en caché.
probado en Windows en Python 2.4 - usted puede hacerlo por uno mismo.
>>> import time
>>> ## Built-in module
>>> def testTime():
now = time.clock() # use time.time() on unix-based systems
import math
print time.clock() - now
>>> testTime()
7.54285810167e-006
>>> ## My own module
>>> def testTime():
now = time.clock()
import myBuiltInModule # Not its actual name ;-)
print time.clock() - now
>>> testTime()
0.00253174635324
>>> testTime()
3.70158777141e-006
Así que hay una gran diferencia entre los módulos en caché y los traídos desde cero. Para ilustrar esto, podemos volver a cargar el módulo:
>>> def testTime():
now = time.clock()
reload(myBuiltInModule)
print time.clock() - now
>>> testTime()
0.00250017809526
Para averiguar cuánto tiempo tarda una importación, la forma más sencilla es probablemente utilizando el timeit module ..
>>> import timeit
>>> t = timeit.Timer('import urllib')
>>> t.timeit(number = 1000000)
0.98621106147766113
Así importar urllib 1 millón de veces, se tomó poco menos de un segundo (en un MacBook Pro) ..
Tengo un script principal que importa otra modules.I necesita para calcular la cantidad de tiempo que tarda
Si quiere decir el tiempo total de ejecución del script, en Linux/OS X/Cygwin, puede ejecutar la secuencia de comandos con el comando time
, por ejemplo:
$ time python myscript.py
real 0m0.046s
user 0m0.024s
sys 0m0.020s
(recuerde que incluye todo el intérprete de Python tiempo de inicio, así como el tiempo de ejecución del código real, aunque es bastante cantidad trivial)
Otra forma es posiblemente más útil para perfilar el guión:
en lugar de ejecutar el código con
$ python myscript.py
..you use ..
$ python -m cProfile myscript.py
1059 function calls in 0.015 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.002 0.002 0.015 0.015 myscript.py:1(<module>)
[...]
no encuentro la salida de línea de comandos muy fácil de leer, por lo que casi siempre utilizo gprof2dot, lo que convierte la información de perfil en un gráfico bastante graphviz:
$ python -m cProfile -o myscript.prof myscript.py
$ python gprof2dot.py -o myscript.dot -f pstats myscript.prof
$ dot -Tpng -o profile.png prof_runtest.dot -Gbgcolor=black
Umm, no creo que esto realmente importe más de una vez. Realmente solo está probando el rendimiento del caché de módulos de Python. 'reload (module)' tampoco tiene el mismo comportamiento que importar desde cero. Responder verdaderamente la pregunta del autor es realmente bastante difícil, a menos que el tiempo de importación sea lo suficientemente grande como para que medir una llamada a la vez sea razonable. –
Una forma de importar perfiles es utilizar el módulo profile_imports utilizado en bzr source code:
# put those two lines at the top of your script
import profile_imports
profile_imports.install()
# display the results
profile_imports.log_stack_info(sys.stderr)
Además de darle el tiempo para las importaciones, esto también calcula el tiempo para compilar expresiones regulares, que a menudo es una causa importante de desaceleración en las importaciones.
Me encontré con este problema perfilando una gran aplicación heredada con un tiempo de inicio de varios segundos. Es relativamente simple reemplazar el importador incorporado con algo que haga algún perfil. A continuación se muestra una forma de mostrar hacky aproximadamente la duración de cada módulo se tarda en ejecutar:
import os
import sys
import time
class ImportEventNode(object):
def __init__(self, name, start_time, children=None, end_time=None):
self.name = name
self.start_time = start_time
self.children = [] if children is None else children
self.end_time = end_time
def __repr__(self):
return 'ImportEventNode({self.name}, {self.start_time}, children={self.children}, end_time={self.end_time})'.format(self=self)
@property
def total_time(self):
return self.end_time - self.start_time
@property
def net_time(self):
return self.total_time - sum(child.total_time for child in self.children)
root_node = cur_node = None
all_nodes = []
old_import = __import__
def __import__(*args, **kwargs):
global root_node, cur_node
name = args[0]
if name not in sys.modules:
t0 = time.time()
if root_node is None:
root_node = prev_node = cur_node = lcur_node = ImportEventNode(args[0], t0)
else:
prev_node = cur_node
cur_node = lcur_node = ImportEventNode(name, t0)
prev_node.children.append(cur_node)
try:
ret = old_import(*args, **kwargs)
finally:
lcur_node.end_time = time.time()
all_nodes.append(lcur_node)
cur_node = prev_node
return ret
else:
return old_import(*args, **kwargs)
__builtins__.__import__ = __import__
se ejecuta en un ejemplo sencillo, así es como se ve en scipy.stats importadores:
:import scipy.stats
:
:nodes = sorted(all_nodes, key=(lambda x: x.net_time), reverse=True)
:for node in nodes[:10]:
: print(node.name, node.net_time)
:
:<EOF>
('pkg_resources', 0.08431100845336914)
('', 0.05861020088195801)
('decomp_schur', 0.016885995864868164)
('PIL', 0.0143890380859375)
('scipy.stats', 0.010602712631225586)
('pkg_resources._vendor.packaging.specifiers', 0.007072925567626953)
('add_newdocs', 0.00637507438659668)
('mtrand', 0.005497932434082031)
('scipy.sparse.linalg', 0.005171060562133789)
('scipy.linalg', 0.004471778869628906)
- 1. ¿'Lock' tarda tiempo de CPU?
- 2. ¿Cuánto tarda mi aplicación Python en ejecutarse?
- 3. eclipse tarda mucho tiempo en inicializar
- 4. JS: ¿Cuánto tiempo se tarda en llamar a una función?
- 5. ¿Cómo puedo calcular cuánto tiempo tarda una función en jQuery?
- 6. WebRequest.GetResponse tarda mucho tiempo a menos que se anule DefaultWebProxy
- 7. ¿Por qué desde ... la importación parece vincularse al valor en tiempo de importación en Python?
- 8. ¿Por qué IIS7 tarda mucho tiempo?
- 9. UIActionSheet tarda mucho tiempo para responder
- 10. ¿Cómo puedo medir el tiempo de CPU que tarda una función Clojure en ejecutarse?
- 11. ¿Cómo medir el tiempo que tarda una función en ejecutarse desde un shell erlang?
- 12. Eclipse tarda mucho tiempo para guardar web.xml
- 13. Python: "POSIX importación" cuestión
- 14. Python: Importación de un "archivo de importación"
- 15. ¿Cómo hacer que falle una compilación de TeamCity (tiempo de espera) si tarda demasiado?
- 16. ¿Cuánto tiempo tarda una consulta que devuelve 5 millones de registros?
- 17. Qt C++ destructor tarda mucho tiempo en regresar
- 18. Función de tiempo de espera si tarda demasiado en terminar
- 19. ¿Por qué el diálogo UAC tarda mucho tiempo en mostrarse?
- 20. PHP/Curl: solicitud HEAD tarda mucho tiempo en algunos sitios
- 21. Python: ¿por qué este código tarda una eternidad (bucle infinito?)
- 22. Python Auto Importación
- 23. ¿Cómo anulo una importación de Python?
- 24. ¿Por qué SQLite tarda tanto tiempo en recuperar los datos?
- 25. Creación de una interfaz web para una secuencia de comandos que tarda 30 minutos en ejecutarse
- 26. El programa SSE tarda mucho más tiempo en AMD que en Intel
- 27. Python: ¿Por qué el tiempo de importación no funciona por tiempo() pero funciona para time.sleep()?
- 28. ¿Por qué tarda mucho tiempo la tarea MSBuild ResolveProjectReferences?
- 29. Mecánica de importación de Python
- 30. Manejo de excepciones. ¿Cuánto tiempo tarda la captura?
Varía. Por favor proporcione un escenario o situación específica. –
-1: Hechos adicionales fueron puestos en comentarios de respuesta. Se deben poner nuevos hechos en la pregunta, no las respuestas. –