2015-11-26 1 views
6

Der magische Befehl %timeit ist großartig, um Code Ausführungszeiten auf interaktive Weise zu messen. Ich möchte jedoch das Ergebnis %timeit erhalten, um die Ergebnisse zu plotten. timeit.timeit ermöglicht dies auch, aber hat nicht die automatische Skalierung der Anzahl der Iterationen und die Normalisierung des Ergebnisses %timeit hat.% Zeitäquivalent in Code

Gibt es eine eingebaute Funktion, die ein Stück Code zeitgesteuert verarbeiten kann, wodurch auch die Anzahl der ausgeführten Iterationen automatisch angepasst wird und ein normalisiertes Ergebnis zurückgegeben wird?

+1

ich glaube, es ist nicht, aber für das Timing können Sie erstellen Sie einfach einen Timer-Dekorator, der Iterationszähler ist nicht so einfach, um es zu arbeiten, wie Sie möchten. – Netwave

+0

https://github.com/ipython/ipython/blob/acb2c91c5522bf1c0cb1c06c1882044a08cdf09b/IPython/core/magics/execution.py#L902 - obwohl aus Benutzerperspektive wahrscheinlich nicht verwendbar. – Caramiriel

Antwort

4

Die Magie %timeit Befehl bietet eine -o Option:

-o: ein TimeitResult zurück, die in einer Variablen gespeichert werden kann, um das Ergebnis in mehr Details zu überprüfen.

Es wird weiterhin das Ergebnis drucken, aber auch das Ergebnis zurückgeben, so dass es in einer Variablen erfasst werden kann. Die Syntax für magische Befehle ist ein wenig begrenzt, aber Sie unterschiedliche Ergebnisse in einem list, indem sie einer Variablen zugewiesen wird und Anhängen dieser Variablen zu einer Liste sammeln konnte:

print(res) 
# [<TimeitResult : 10000000 loops, best of 3: 61.2 ns per loop>, 
# <TimeitResult : 10000000 loops, best of 3: 61.3 ns per loop>, 
# <TimeitResult : 10000000 loops, best of 3: 61.5 ns per loop>] 
:

res = [] 
for i in range(3): 
    a = %timeit -o 10*10 
    res.append(a) 
# 10000000 loops, best of 3: 61 ns per loop 
# 10000000 loops, best of 3: 61.1 ns per loop 
# 10000000 loops, best of 3: 60.8 ns per loop 

und dann res zugreifen

Jede dieser Ergebnisse hat mehrere Attribute, die von Interesse sein könnten:

print(res[0].all_runs) 
# [0.6166532894762563, 0.6102780388983005, 0.6370787790842183] 
print(res[0].best) 
# 6.102780388983005e-08 
print(res[0].compile_time) 
# 0.00020554513866197934 
print(res[0].loops) 
# 10000000 
print(res[0].repeat) 
# 3 
print(res[0].worst) 
# 1.1170931449020795e-06 

zeichnen die besten Zeiten zum Beispiel Sie müssen Sie eine neue Liste erstellen, um die besten Werte enthalten:

res_best_times = [result.best * 1e9 for result in res] 
# "* 1e9" to get the result in nanoseconds 
print(res_best_times) 
# [61.2, 61.3, 61.5] 
2

Angenommen, Sie verwenden können/Import IPython, und Sie wollen einfach eine Maden Skript erstellen, das die %timeit Magie verwendet, könnten Sie so etwas wie die folgenden Aktionen aus.

Angenommen, die folgenden in der Datei testme.py ist:

from IPython import get_ipython 

def myfun(x): 
    return x**x 

val = 12.3 
out = get_ipython().run_line_magic("timeit","-o myfun({})".format(val)) 

#do something with out, which will be a TimeitResult object 

Dann können Sie das Skript nicht interaktiv mit ausführen:

ipython testme.py 
+0

Ich baute auf MSeiferts Vorschlag auf, die -o-Flagge auf die Magie anzuwenden, um die Ausgabe zu erfassen ... – svohara