2016-09-15 40 views
3

我一直在做一些性能测试,并对我的最新发现颇感好奇。导入模块基准

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

因为当你想要导入一个模块的某个部分时,所有通过模块的命名空间进行搜索,将对象存储在堆栈中并从中弹出需要花费时间,而对于一次导入模块,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模块。因此结果。