2016-09-15 2 views
3

Ich habe einige Leistungstests gemacht und bin ziemlich neugierig auf meine neuesten Erkenntnisse.Import Modul Benchmark

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

Wie kann das Importieren der gesamte Modul schneller sein, als nur bestimmten Teil zu importieren?

auf den Antworten Basierend, ich habe einige Tests getan und ich kam in den folgenden:

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

In Bezug auf Leistung, wenn Sie sich mit einer Klasse/Funktion/Submodul viel planen, Es dauert weniger Zeit, wenn Sie angeben, von wo aus importiert werden soll, und kann die beim Import verlorene Zeit ausgleichen oder sogar ausgleichen.

Antwort

2

Wenn Sie einen/einige Teile eines Moduls importieren wollen, müssen alle Suchen im Namespace des Moduls, das Speichern des Objekts im Stack und das Abrufen von Daten zeitaufwendig sein , das Modul an seinen Namen binden.

Zur besseren Demonstration können Sie dis Modul zur Überprüfung der Bytecode für zwei Rezepte separat verwenden:

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 

Wie Sie im zweiten Fall sehen wir eine IMPORT_FROM und POP_TOP mehr als die erste haben.

2

import timeit wird das Modul direkt erhalten, während from timeit import timeit Zeit dauern wird Durchsuchen gesamte Timeit-Modul. Daher die Ergebnisse.