Python: from module vs. from__main__ weird behavior using timei Python: 从模块导入 vs. 从__main__奇怪的行为,使用timei

2024-06-28 19:55:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以我试图通过调用一个用户定义的函数来计时dict理解词典的创建。 但是当我用上面的代码执行时,timeit似乎执行了两次。 解释器输出两个不同的时间。你知道吗

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

那么这两种说法有区别吗? 当模块是主模块时,写from [module] import [obj]是错误的吗? 或者它与timeit的设置参数如何工作有关?你知道吗

请开导我。干杯。你知道吗


Tags: 模块infrompytestimportnumberfor
2条回答

因为你包括了测试.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)

__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。你知道吗

相关问题 更多 >