I am trying to run a particular test multiple times in ipython
using the
%timeit
magic function. For demonstration purposes, I will just use -n1
instead of
-n3
here, and use a simple print(1)
function.
The %%timeit
and the %timeit
help says the following:
Options: -n<N>: execute the given statement <N> times in a loop. If this
value is not given, a fitting value is chosen.
-r<R>: repeat the loop iteration <R> times and take the best result.
Default: 3 (the 3 here is a typo in ipython, for which I have submitted a
PR)
However, if I do the following:
%%timeit -n1
print(1)
or
%timeit -n1 print(1)
it actually prints 1
7 times in a row as follows
In[1]: %timeit -n1 print(1)
1
1
1
1
1
1
1
32.8 µs ± 38.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
I was expecting that because of the definition of %%timeit
/%timeit
it would
run the cell
or code
just once.
I have read this post: https://stackoverflow.com/a/45375047/4752883
which gives some examples of how %%timeit
runs and the actual source code of ipython
magic function %%timeit
here: https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py#L944
where they define 2 types of loops: 1) -n<N>
and 2) -r<R>
.
If I just use -n1
, it seems that it also assumes that I have used -r7
, i.e.
-n1
defaults to -n1 -r7
. This means that even though I want it to run for
exactly 1 run, it will still run the code_block
7 times as per
https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py#L1021
unless I also specify -n1 -r1
.
code_block
using -n<N>
and
-r<R>
?-n<N>
and -r<R>
and why is this
necessary?These parameters are also in the timeit module.
-n
determines how many times you run the function (or block, or whatever) inside the timing window. So the stopwatch starts, the code is run n
times, then the stopwatch ends. You should run it enough times that the results are meaningful (timeit
defaults to powers of 10 until 0.2 seconds have elapsed).-r
determines how many of these repetitions (where repetition is "start timer, run n times, stop timer") you should do. There is always some error due to your CPU scheduling other processes, etc., so usually you want to run it a few times and the best value of these r
times is taken. (timeit
defaults to 3, and the comments in the source you link indicate that ipython does the same -- but the actual code may disagree).In pseudo-python, you can see how n
and r
affect the timing process:
time_hist = []
for _ in range(r):
t0 = time.now() # Start stopwatch (.now() is not a real function)
for _ in range(n):
# <your code block>
t1 = time.now() # Stop stopwatch
time_hist.append(t1 - t0) # Append time delta
return min(time_hist) # Return the min of the r deltas
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With