导入模块基准

时间:2016-09-15 13:03:17

标签: python performance time

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

>>> 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

关于性能,如果您计划大量使用类/函数/子模块,如果您指定从哪里导入并且可以抵消甚至更少,则花费的时间更少弥补进口中丢失的时间。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

因为当你想要导入模块的一个/某个部分时,所有搜索模块的命名空间,将对象存储在堆栈中并从中弹出它需要时间,而同时导入模块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