此 Python 3.11 脚本基准测试函数
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}')
我打算将
f(a)
的结果存储在 m
中,但是对 ti.repeat
的调用并没有做到这一点。我得到:
m = f(a): 0.104ms 0.118ms None
为了实现这一点,我需要改变什么?我尝试了
globals={'f': f, 'a': a, 'm': m}
和 setup='global m'
,结果相同。
这是因为
timeit
在函数中执行给定的代码字符串,因此对命名空间所做的更改仅影响函数的本地命名空间。
您可以使用
globals
函数显式更改全局命名空间:
fun = f'globals()["m"] = f(a)'
或者,由于
f(a)
始终返回相同的值,因此更典型且可以说是首选的方法是简单地将语句作为 timeit
之外的常规语句执行:
fun = f'm = f(a)'
m = f(a)