我正在学习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参数如何工作有关?
请赐教。欢呼声。
答案 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)