Python:'from module'与'from__main__'使用timeit的奇怪行为

时间:2014-03-14 00:13:08

标签: python module main timeit

我正在学习python,当我意识到一种我无法解释的奇怪行为时,我只是在玩timeit模块。

#test.py

import timeit

def dictComp(I):
    return {x: x for x in I}

t = timeit.timeit(number=5,
                  stmt='dictComp(I)',
                  setup='from test import dictComp\nI=range(1000000)')
print(t)

所以我试图通过调用用户定义的函数来计算字典理解的词典创建时间。 但是当我使用上面的代码执行此操作时,timeit似乎执行了两次。 解释器输出两次不同的时间。

但是当我将设置字符串更改为from __main__而不是from test时,timeit只运行一次(如预期的那样)。

这两个陈述之间有区别吗? 当模块是主模块时写from [module] import [obj]是不对的? 或者它与timeit的setup参数如何工作有关?

请赐教。欢呼声。

2 个答案:

答案 0 :(得分:2)

__main__模块不是test模块,即使它们来自同一个文件。当执行命中

from test import dictComp

test.py再次执行,这次是test模块而不是main模块。 (当执行第二次执行该行时,test已被导入,因此该文件不会第三次运行。)

timeit电话之类的内容放入if __name__ == '__main__'后卫中是一种很好的做法:

if __name__ == '__main__':
    t = timeit.timeit(...)

    print(t)

如果你不这样做,那么肯定会导入from __main__而不是from test

答案 1 :(得分:0)

因为您将test.py文件包含两次__main__而将test一次检查出来!

#test.py

import timeit

def dictComp(I):
    return {x: x for x in I}

print __name__
t = timeit.timeit(number=5,
                  stmt='dictComp(I)',
                  setup='from test import dictComp\nI=range(1000000)')
print(t)