如何正确导入一个在timeit中使用的函数

时间:2014-01-26 23:34:01

标签: python timeit

我正在使用timeit函数在我编写的两种方法上运行一些指标,而且我遇到了一个问题。请参阅下面的简化示例文件:

fileA.py,这是独立运行的,我正在尝试使用timeit来测试函数foo:

if (len(sys.argv) < 2):
    print "Need a command line argument, exiting"
    sys.exit(1)

def foo(n):
    #does some stuff, returns an int

此功能可以独立运行,我可以将其作为./fileA.py 5

运行

我有一个类似的文件,fileB.py是foo的不同实现,但除了foo的内部之外完全相同。

现在我有一个fileC,我试图在fileA和fileB上使用timeit(省略了fileB部分):

for n in range(0,10):
    setupStr = 'from fileA import foo'
    setupStr += '; from __main__ import n'
    mytime = timeit.Timer('foo(n)', setupStr)
    timeTaken = mytime.timeit(1)
    print #results, not important

我得到的问题是,当我运行fileC.py时,我得到“需要命令行参数,退出”并退出。我知道这是来自fileA.py,但为什么这部分代码会运行呢?我的印象是timeit的工作方式,我只是从fileA导入foo。我错了吗?如果是这样,那么最好的方法是什么,以便我可以测试方法foo(n)并保持fileA能够使用所需的命令行参数独立运行?

1 个答案:

答案 0 :(得分:2)

Python必须评估整个fileA模块以解析from fileA import foo - 将foo作为模块级变量名而不是函数创建是完全合法的,由代码创建必须进行评估以获得正确的值。为了避免这种情况,请在fileA独立调用if __name__ == '__main__': if (len(sys.argv) < 2): ... 时包装应该只运行的代码:

{{1}}

有关更详细的说明,请参阅此问题的已接受答案: What does if __name__ == "__main__": do?