我正在学习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 dictCompnI=range(1000000)')
print(t)
因此,我试图通过调用用户定义的函数来计时具有字典推导式的字典创建。但是当我用上面的代码这样做时,timeit似乎执行了两次。解释器输出两个不同的时间
但是当我将设置字符串更改为from __main__
而不是from test
时,timeit只运行一次(如预期的那样)。
那么这两个语句之间有区别吗?当模块是主模块时,写from [module] import [obj]
是错误的吗?或者它与timeit的设置参数如何工作有关?
请开导我。欢呼。
__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
。
因为您包含了两次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 dictCompnI=range(1000000)')
print(t)