This Python 3.11 script benchmarks function f:
import numpy as np, timeit as ti
def f(a):
return np.median(a)
a = np.random.rand(10_000)
m = None
fun = f'm = f(a)'
t = 1000 * np.array(ti.repeat(stmt=fun, setup=fun, globals=globals(), number=1, repeat=100))
print(f'{fun}: {np.amin(t):6.3f}ms {np.median(t):6.3f}ms {m}')
I intended to get the result of f(a) stored in m, but the call to ti.repeat doesn't do it. I'm getting:
m = f(a): 0.104ms 0.118ms None
What do I need to change in order to get that? I tried globals={'f': f, 'a': a, 'm': m} and setup='global m' with the same result.
This is because
timeitexecutes the given string of code in a function so changes made to the namespace affects only the local namespace of the function.You can instead explicitly change the global namespace by assigning to the dict returned by the
globalsfunction:Alternatively, since
f(a)always returns the same value, a more typical and arguably preferred approach would be to simply executem = f(a)as a regular statement outside oftimeit: