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

时间:2014-09-10 15:04:48

标签: python namespaces timeit

我需要计算跨越可变数据量的函数执行时间。

def foo(raw_data):
   preprocessed_data = preprocess_data(raw_data)
   time = timeit.Timer('module.expensive_func(preprocessed_data)', 'import module').timeit()

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

如何将data导入timeit.Timer环境?

2 个答案:

答案 0 :(得分:5)

将密码传递给时间,而不是字符串。 (不幸的是,这会引入一些额外的函数调用开销,所以只有当时间淹没那个开销时它才可行。)

time = timeit.timeit(lambda: module.expensive_func(data))

在Python 3.5及更高版本中,您还可以使用字符串语句指定显式globals字典:

time = timeit.timeit('module.expensive_func(data)',
                     globals={'module': module, 'data': data})

答案 1 :(得分:0)

pdb调试器和类方法中,接受的答案对我没有用。有效的解决方案是将变量添加到globals()

globals()['data'] = data
globals()['self'] = self
timeit.timeit(lambda: self.function(data))
  

请注意,由于额外的函数调用,在这种情况下,时序开销会略大一些。 [source]