如何为这次调用定义全局变量?

问题描述 投票:0回答:1

此 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'
,结果相同。

python global timeit
1个回答
0
投票

这是因为

timeit
在函数中执行给定的代码字符串,因此对命名空间所做的更改仅影响函数的本地命名空间。

您可以使用

globals
函数显式更改全局命名空间:

fun = f'globals()["m"] = f(a)'

或者,由于

f(a)
始终返回相同的值,因此更典型且可以说是首选的方法是简单地将语句作为
timeit
之外的常规语句执行:

fun = f'm = f(a)'
m = f(a)
© www.soinside.com 2019 - 2024. All rights reserved.