Incompatibilité entre le %de temps et %timeit dans IPython
Je suis confronté à une situation bizarre que je ne peux pas l'expliquer. Voici mon test de synchronisation de la génération d'une grande liste de tuples:
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
Comme vous pouvez le voir, la génération de cette grande liste de tuples prend juste en dessous d'un deuxième. timeit rapports, le temps d'exécution à l'ordre de 0,1 seconde. Pourquoi est-il une si grande différence dans les deux rapports?
(Testé sur IPython 0.11, Python 2.6.5.)
- Vous obtenez le même résultat si vous exécutez %timeit premier et le %de temps de la deuxième?
- Intéressant commentaire. Oui, j'obtiens des résultats similaires avec une inversion de l'ordre d'exécution.
- Je ne sais pas IronPython, donc je ne peux pas en dire beaucoup sur
%time
ou%timeit
, mais j'imagine que%time
répète le test de chronométrage 10 fois. - Je ne suis pas à l'aide de IronPython, mais IPython. Aussi %timeit est la fonction qui exécute la commande plusieurs fois, pas %du temps.
- %timeit fait un best of des 3 pistes, donc ce n':
for i in range(3): %time res=get_list_of_tuples()
vous obtenez? Pour cette raison, il est normal qu' %timeit de rapport des nombres plus petits (en général, je vois ~2x), mais 10x, c'est beaucoup. Je ne suppose pas que vous êtes sur Windows? - J'ai testé ce code sur Linux (CentOS 5 et 6, Ubuntu, Mac OS X) et obtenir des résultats similaires sur tous les OS. L'exécution de %de temps de plusieurs ne change pas les résultats.
Vous devez vous connecter pour publier un commentaire.
La principale différence est que "par défaut, timeit() permet de désactiver temporairement la collecte des ordures pendant le chronométrage".
Tournant de la collecte des déchets renvoie des résultats similaires à celui indiqué dans la question, c'est à dire le temps d'exécution avec la collecte des ordures est grandeur plus grand que celui qui est sans:
Benoit,
Si j'utilise Python 2.6.6 et IPython 0.10 puis-je voir les réponses semblables à la vôtre. À l'aide de Python 2.7.1 et IPython 0.10.1 l'a-je obtenir quelque chose de plus raisonnable:
%délai d'instruction s'exécute qu'une seule fois, et ont une erreur de mesure
%timeit des pistes de déclaration à quelques reprises, et des choses plus précise.
Voir Python documentation du module timeit pour les quelques explications
import dis; dis.dis(generate_list_of_tuples)
. La version 2.6 de Python génère quelques insturctions code sur pastebin, mais cela ne devrait pas affecter le temps tellement. Honnêtement, je ne sais pas la raison de cette incohérence, c'est peut-être en quelque sorte lié à garbage collector en 2.6, mais c'est juste une supposition.