2017-06-08 2 views
1

Ich sehe ein Problem, bei dem die Ausführung meines Python-Skripts manchmal länger dauern kann, um Bibliotheken zu importieren. Dies passiert, wenn ich das Skript kürzlich nicht ausgeführt habe oder wenn ich das Skript von einem anderen Server aus ausführe. Nach der ersten Verzögerung werden die Importzeiten viel schneller. Ich habe mich gefragt, was diesen langsamen Import verursacht und ob es einen Weg gibt, das zu verhindern?Was verursacht diese Verzögerung beim Importieren von Bibliotheken?

import time 
s_time = time.time() 
import sys,re,os,logging,signal 
from argparse import ArgumentParser 
print('Internal Import Time: {}'.format(time.time() - s_time)) 
s_time = time.time() 
from backtrace import Backtrace,BacktraceSet 
from report import Report 
from core  import Core 
from burtapi import BurtAPI 
print('External Import Time: {}'.format(time.time() - s_time)) 

In diesem Beispiel Backtrace, Bericht, Kern und burtapi sind Bibliotheken, die ich erstellt.

[[email protected] tool]$ ./tool --python 
Internal Import Time: 2.8281359672546387 
External Import Time: 13.053943157196045 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 
[[email protected] tool]$ ./tool --python 
Internal Import Time: 0.12279081344604492 
External Import Time: 0.6948020458221436 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 

ssh to different server (with same storage mount) 

[[email protected] tool]$ ./tool --python 
Internal Import Time: 3.0217390060424805 
External Import Time: 13.151482105255127 
Enter/Paste your content. Ctrl-D to save it. 
^CYou pressed Ctrl+C! 
[[email protected] tool]$ 

./tool ​​ist ein Bash-Skript, das python3 /path/to/script.py

+0

Es ist wahrscheinlich die Zeit, die Python benötigt, um vor dem ersten Lauf Byte-Code zu erzeugen (einige Bibliotheken zu kompilieren). Es ist auch, was gesehen werden kann, wenn Sie .pyc-Dateien löschen. Mehr dazu hier: https://stackoverflow.com/questions/2998215/if-python-is-interpreted-what-are-pyc-files Versuchen Sie, die .pyc-Dateien in den Ordnern zu löschen, in denen Sie die von Ihnen erstellten Bibliotheken abgelegt haben sehen, ob das Gleiche passiert. – ma3oun

+0

@ ma3oun Wie bestimmt Python, wann es neu kompilieren muss? Der Byte-Code befindet sich in __pycache__, aber wenn ich mehrere Stunden warte oder den Server ändere, löst dies eine weitere Kompilierung aus, obwohl der Byte-Code bereits existiert. – Takkun

Antwort

1

Es gibt mehr Faktoren sind hier nennt, aber es gibt drei wichtigsten:

erste - ein Modul einge erfordert die Module auf Ihrem System zu finden, Dazu müssen Daten von Ihrer Festplatte gelesen werden.

Zweitens - wenn Änderungen in diesen Modulen vorgenommen werden, müsste der Interpreter sie beißen.

Last but not least, wenn der Interpreter beginnt, sie zu importieren, können die Module selbst Anweisungen/Code enthalten, der ausgeführt werden muss, der viele Operationen ausführen könnte. Stellen Sie sich vor, eines dieser Module verbindet sich mit einer Datenbank oder muss durch eine große Hashtabelle ...

Edit: Ich sollte darauf hinweisen, dass dies Annahmen sind und es ist schwer zu sagen, was genau passiert in Ihrem Fall, aber in den meisten Fälle das ist was passiert.

Verwandte Themen