notebook - Inconsistencia entre% tiempo y% tiempo en IPython
jupyter notebook tutorial pdf (3)
Me enfrento a una situación extraña que no puedo explicar. Aquí está mi prueba cronometrando la generación de una gran lista de tuplas:
In [1]: def get_list_of_tuples():
...: return [(i,) for i in range(10**6)]
...:
In [2]: %time res = get_list_of_tuples()
CPU times: user 0.93 s, sys: 0.08 s, total: 1.01 s
Wall time: 0.98 s
In [3]: %timeit res = get_list_of_tuples()
1 loops, best of 3: 92.1 ms per loop
Como puede ver, la generación de esta gran lista de tuplas toma poco menos de un segundo. timeit informa que el tiempo de ejecución es de alrededor de 0.1 segundo. ¿Por qué hay una gran diferencia en los dos informes?
(Probado en IPython 0.11, Python 2.6.5.)
% de tiempo: ejecuta la instrucción solo una vez y tiene un error de medición
% timeit: ejecuta la sentencia varias veces y elige la hora más precisa.
Consulte la documentación del módulo de tiempo de Python para algunas explicaciones.
Benoit,
Si uso Python 2.6.6 e IPython 0.10, veo respuestas similares a las suyas. Al usar Python 2.7.1 y IPython 0.10.1 obtengo algo más sensato:
% ipython
Python 2.7.1 (r271:86832, Nov 3 2011, 16:23:57)
Type "copyright", "credits" or "license" for more information.
IPython 0.10.1 -- An enhanced Interactive Python.
In [1]: def get_list_of_tuples():
...: return [(i,) for i in range(10**6)]
...:
In [2]: %time res = get_list_of_tuples()
CPU times: user 0.25 s, sys: 0.10 s, total: 0.35 s
Wall time: 0.35 s
In [3]: %timeit res = get_list_of_tuples()
1 loops, best of 3: 215 ms per loop
La principal diferencia es que " de forma predeterminada, timeit () desactiva temporalmente la recolección de basura durante el tiempo ".
Al girar la recolección de basura se obtienen resultados similares a los que se muestran en la pregunta, es decir, el tiempo de ejecución con la recolección de basura es una magnitud mayor que la que no tiene:
In [1]: import timeit
# Garbage collection on.
In [2]: N = 10; timeit.timeit(''[(i,) for i in range(10**6)]'', ''gc.enable()'', number=N) / N
Out[2]: 0.74884700775146484
# 749 ms per loop.
# Garbage collection off.
In [3]: N = 10; timeit.timeit(''[(i,) for i in range(10**6)]'', number=N) / N
Out[3]: 0.15906109809875488
# 159 ms per loop.