2016-09-15 28 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模塊。因此結果。