【问题标题】:Python: 'from module' vs. 'from__main__' weird behavior using timeitPython:使用 timeit 的“来自模块”与“来自__main__”的奇怪行为
【发布时间】:2014-04-19 01:50:17
【问题描述】:

我正在学习 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参数有什么关系?

请赐教。干杯。

【问题讨论】:

    标签: python module main timeit


    【解决方案1】:

    __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

    【讨论】:

      【解决方案2】:

      因为您将 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)
      

      【讨论】:

        猜你喜欢
        • 2020-02-10
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多