蟒蛇:'from module' vs. 使用timeit 'from__main__'奇怪的行为



我正在学习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)

相关内容

  • 没有找到相关文章

最新更新