0

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

4

1 回答 1

2

Python 必须评估整个fileA模块才能解析from fileA import foo——拥有一个模块级变量名而不是一个函数是完全合法的,它是foo由必须评估以获得正确值的代码创建的。为避免这种情况,请将本应仅在fileA被独立调用时运行的代码包装在:

if __name__ == '__main__':
    if (len(sys.argv) < 2):
        ...

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

于 2014-01-26T23:43:32.413 回答