146 votes

tic, toc fonctions analogiques en Python

Quelle est la meilleure analogique de MATLAB tic et toc fonctions ( http://www.mathworks.com/help/techdoc/ref/tic.html) en Python?

227voto

Eli Bendersky Points 82298

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.

24voto

GuestPoster Points 51

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()

19voto

Stefan Points 1328

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 tics et tocs 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' tics et tocs. 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.

5voto

ThiefMaster Points 135805

Jetez un oeil à l' timeitmodule. 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X