我正在使用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能够使用所需的命令行参数独立运行?
答案 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?