Quelle est la meilleure analogique de MATLAB tic et toc fonctions ( http://www.mathworks.com/help/techdoc/ref/tic.html) en Python?
Réponses
Trop de publicités?Hormis timeit
qui ThiefMaster mentionné, une façon simple de le faire est juste (après l'importation time
):
t = time.time()
# do stuff
elapsed = time.time() - t
J'ai une classe helper, je tiens à utiliser:
class Timer(object):
def __init__(self, name=None):
self.name = name
def __enter__(self):
self.tstart = time.time()
def __exit__(self, type, value, traceback):
if self.name:
print '[%s]' % self.name,
print 'Elapsed: %s' % (time.time() - self.tstart)
Il peut être utilisé comme un gestionnaire de contexte:
with Timer('foo_stuff'):
# do some foo
# do some stuff
Parfois, je trouve cette technique plus pratique que d' timeit
- tout dépend de ce que vous voulez mesurer.
Le meilleur absolu analogique de tic et de toc serait tout simplement de les définir en python.
def tic():
#Homemade version of matlab tic and toc functions
import time
global startTime_for_tictoc
startTime_for_tictoc = time.time()
def toc():
import time
if 'startTime_for_tictoc' in globals():
print "Elapsed time is " + str(time.time() - startTime_for_tictoc) + " seconds."
else:
print "Toc: start time not set"
Ensuite, vous pouvez les utiliser comme:
tic()
# do stuff
toc()
Généralement, IPython de l' %time
, %timeit
, %prun
et %lprun
(si on a de la line_profiler
installé) satisfaire ma profilage des besoins assez bien. Cependant, un cas d'utilisation pour l' tic-toc
-comme fonctionnalité est survenu lorsque j'ai essayé de calculs de profils qui ont été conduit de manière interactive, c'est à dire, par l'utilisateur, les mouvements de souris dans une interface graphique. Je me sentais comme le spamming tic
s et toc
s dans les sources tout en testant de manière interactive serait le moyen le plus rapide pour révéler les goulets d'étranglement. Je suis allé avec Eli Bendersky de l' Timer
classe, mais n'a pas été pleinement heureux, car il m'a obligé à modifier l'indentation de mon code, ce qui peut être gênant dans certains éditeurs et confond le système de contrôle de version. En outre, il peut être nécessaire de mesurer le temps entre les points dans les différentes fonctions, ce qui ne serait pas travailler avec l' with
déclaration. Après avoir essayé beaucoup de Python, de l'astuce, ici, est la solution la plus simple que j'ai trouvé qui fonctionnait le mieux:
from time import time
_tstart_stack = []
def tic():
_tstart_stack.append(time())
def toc(fmt="Elapsed: %s s"):
print fmt % (time() - _tstart_stack.pop())
Puisque cela fonctionne en poussant les heures de départ sur une pile, il peut fonctionner correctement pour plusieurs niveaux d' tic
s et toc
s. Elle permet de modifier le format de la chaîne de l' toc
déclaration pour afficher des informations supplémentaires, que j'ai aimé à propos d'Eli Timer
classe.
Pour une raison que je suis concerné par la surcharge d'un pur Python de mise en œuvre, alors j'ai testé un C module d'extension ainsi:
#include <Python.h>
#include <mach/mach_time.h>
#define MAXDEPTH 100
uint64_t start[MAXDEPTH];
int lvl=0;
static PyObject* tic(PyObject *self, PyObject *args) {
start[lvl++] = mach_absolute_time();
Py_RETURN_NONE;
}
static PyObject* toc(PyObject *self, PyObject *args) {
return PyFloat_FromDouble(
(double)(mach_absolute_time() - start[--lvl]) / 1000000000L);
}
static PyObject* res(PyObject *self, PyObject *args) {
return tic(NULL, NULL), toc(NULL, NULL);
}
static PyMethodDef methods[] = {
{"tic", tic, METH_NOARGS, "Start timer"},
{"toc", toc, METH_NOARGS, "Stop timer"},
{"res", res, METH_NOARGS, "Test timer resolution"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
inittictoc(void) {
Py_InitModule("tictoc", methods);
}
C'est pour MacOSX, et j'ai omis de code pour vérifier si lvl
est en dehors des limites pour des raisons de concision. Alors qu' tictoc.res()
donne une résolution d'environ 50 nanosecondes sur mon système, j'ai trouvé que la gigue de la mesure de toute Python déclaration est facilement dans la microseconde gamme (et beaucoup plus quand utilisé à partir de IPython). À ce stade, les frais généraux de l'Python de la mise en œuvre devient négligeable, de sorte qu'il peut être utilisé avec la même confiance que le C de la mise en œuvre.
J'ai trouvé que l'utilité de l' tic-toc
-est pratiquement limité aux blocs de code qui prennent plus de 10 microsecondes à exécuter. Au-dessous, le calcul de la moyenne des stratégies comme en timeit
sont nécessaires pour obtenir une fidèle de mesure.
Jetez un oeil à l' timeit
module.
Ce n'est pas vraiment à la hauteur, mais si le code que vous voulez le temps est à l'intérieur d'une fonction, vous pouvez facilement l'utiliser.