350 votes

Mesure du temps d'exécution des fonctions dans R

Existe-t-il une manière standardisée en R de mesurer le temps d'exécution d'une fonction ?

Évidemment, je peux prendre system.time avant et après l'exécution et ensuite prendre la différence entre les deux, mais j'aimerais savoir s'il existe une méthode ou une fonction standardisée (j'aimerais ne pas inventer la roue).


Je crois me souvenir que j'ai déjà utilisé quelque chose de semblable à ce qui suit :

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

2 votes

Je pense que vous avez proc.time sur la cause de l'esprit system.time est celui dont vous avez besoin.

2 votes

Pour les fonctions plus importantes, Rprof c'est bien. Il fournit un profil de tous les processus dans un morceau de code/fonction.

51 votes

Les nouveaux utilisateurs de R ont trouvé cette question sur Google : require(microbenchmark) est maintenant (depuis quelques années) le moyen standard de la communauté pour chronométrer les choses. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark) . Cela fait un statistiques comparaison de lm vs glm sur 1000 essais, plutôt que system.time le test n'est effectué qu'une seule fois.

318voto

Shreyes Points 234

Une autre façon de procéder serait d'utiliser Sys.time() :

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Ce n'est pas la façon la plus élégante de le faire, par rapport à la réponse ci-dessus, mais c'est une façon de le faire.

17 votes

Cette méthode est beaucoup plus économe en mémoire que system.time(), qui copie effectivement ses arguments. C'est important lorsque vous avez affaire à des données qui tiennent à peine dans votre RAM.

4 votes

Pour les personnes qui utilisent Sys.time veuillez lire ce qui suit pour prendre connaissance de certains avertissements : Chronométrer le code R avec Sys.time()

1 votes

system.time() était plus rapide pour moi. Je pense que cette réponse pour system.time() doit être accepté !

219voto

Andrie Points 66979

La fonction intégrée system.time() le fera.

Utilisez comme : system.time(result <- myfunction(with, arguments))

1 votes

Il est important de savoir que system.time() a un argument gcFirst qui est TRUE par défaut. D'un côté, cela rend la mesure un peu plus reproductible, mais peut générer un surcoût important de la durée totale d'exécution (qui n'est pas mesurée, bien sûr).

2 votes

Quelle est l'unité de mesure ? Par exemple, je viens d'exécuter la commande suivante system.time(result <- myfunction(with, arguments)) et j'ai obtenu 187.564 comme résultat - c'est en secondes ou quoi ?

0 votes

Pour les personnes qui utilisent system.time veuillez lire ce qui suit pour prendre connaissance de certains avertissements : erreurs "object not found" et "unexpected symbol" lors du chronométrage du code R avec system.time() .

64voto

Sacha Epskamp Points 14956

Comme l'a dit Andrie, system.time() fonctionne bien. Pour les fonctions courtes, je préfère mettre replicate() en elle :

system.time( replicate(10000, myfunction(with,arguments) ) )

31 votes

Il est préférable d'utiliser le package microbenchmark car il n'inclut pas l'overhead de la réplication dans le timing.

41voto

csgillespie Points 20349

Une façon un peu plus agréable de mesurer le temps d'exécution est d'utiliser la fonction rbenchmark paquet. Ce paquet vous permet (facilement) de spécifier combien de fois vous devez reproduire votre test et quel doit être le point de référence relatif.

Voir aussi une question connexe à stats.stackexchange

6 votes

Le microbenchmark est encore meilleur car il utilise des fonctions de synchronisation de plus haute précision.

4 votes

@hadley Mais rbenchmark est plus convivial en cas de comparaisons. Pour moi microbenchmark est amélioré system.time. rmicrobenchmark est ce dont nous avons besoin :)

3 votes

Le mainteneur de microbenchmark est assez réactif - je parie qu'il ajoutera ce dont vous avez besoin.

14voto

Richie Cotton Points 35365

Vous pouvez utiliser le style MATLAB tic - toc fonctions, si vous préférez. Voir cette autre question sur la SO

Fonction chronomètre dans R

0 votes

J'allais ajouter proc.time() Je préfère le joli nom. =)

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