【问题标题】:Import Module Benchmark导入模块基准
【发布时间】:2017-01-23 12:27:35
【问题描述】:

我一直在进行一些性能测试,并对我的最新发现感到相当好奇。

>>> timeit("import timeit")
0.8010718822479248
>>> timeit("from timeit import timeit")
1.3421258926391602

如何导入整个模块比导入特定部分更快

根据答案,我一直在做一些测试,结果如下:

>>> timeit("x = timeit.timeit", setup="import timeit")
0.09205102920532227
>>> timeit("x = timeit", setup="from timeit import timeit")
0.0244600772857666

关于性能,如果您打算大量使用类/函数/子模块,如果您指定从哪里导入并且可以抵消甚至弥补导入中损失的时间。

【问题讨论】:

    标签: python performance time


    【解决方案1】:

    因为当您想要导入模块的一个/某些部分时,所有通过模块的名称空间进行搜索,将对象存储在堆栈中并从中弹出都需要时间,而一次导入模块,python 只需一步,将模块绑定到其名称。

    为了更好的演示,您可以使用dis 模块分别检查两个配方的字节码:

    In [10]: def import_all():
        import timeit
       ....:     
    
    In [11]: def import_one():
       ....:     from timeit import timeit
       ....:     
    
    In [12]: import dis
    
    In [13]: dis.dis(import_all)
      2           0 LOAD_CONST               1 (0)
                  3 LOAD_CONST               0 (None)
                  6 IMPORT_NAME              0 (timeit)
                  9 STORE_FAST               0 (timeit)
                 12 LOAD_CONST               0 (None)
                 15 RETURN_VALUE
    
    In [14]: dis.dis(import_one)
      2           0 LOAD_CONST               1 (0)
                  3 LOAD_CONST               2 (('timeit',))
                  6 IMPORT_NAME              0 (timeit)
                  9 IMPORT_FROM              0 (timeit)
                 12 STORE_FAST               0 (timeit)
                 15 POP_TOP
                 16 LOAD_CONST               0 (None)
                 19 RETURN_VALUE
    

    正如您在第二种情况下看到的那样,我们有一个IMPORT_FROMPOP_TOP 比第一个多。

    【讨论】:

      【解决方案2】:

      import timeit 将直接获取模块,而from timeit import timeit 将花费时间浏览整个 timeit 模块。因此结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 2021-05-19
        • 2020-04-14
        • 2020-11-13
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多