将函数中的局部变量导入timeit

EMi*_*ler 5 python namespaces timeit

我需要在可变数量的数据上计时函数的执行时间。

def foo(raw_data):
   preprocessed_data = preprocess_data(raw_data)
   time = timeit.Timer('module.expensive_func(preprocessed_data)', 'import module').timeit()
Run Code Online (Sandbox Code Playgroud)

但是,preprocessed_data不是全局变量。无法使用导入from __main__。它在此子例程中是本地的。

如何导入datatimeit.Timer环境中?

use*_*ica 5

将其传递给时间可调用对象,而不是字符串。(不幸的是,这引入了一些额外的函数调用开销,因此仅当时间浪费掉这些开销时才可行。)

time = timeit.timeit(lambda: module.expensive_func(data))
Run Code Online (Sandbox Code Playgroud)

在Python 3.5及更高版本中,您还可以指定一个显式的globals字典,并带有一个字符串语句来设置时间:

time = timeit.timeit('module.expensive_func(data)',
                     globals={'module': module, 'data': data})
Run Code Online (Sandbox Code Playgroud)