Ich war überrascht, dass die tatsächlichen Kostenzahlen für die wiederholten Ladeprüfungen nicht bereits veröffentlicht wurden, obwohl es viele gute Erklärungen dafür gibt, was zu erwarten ist.
Wenn Sie oben importieren, nehmen Sie den Lasttreffer, egal was passiert. Das ist ziemlich klein, aber normalerweise in Millisekunden, nicht in Nanosekunden.
Wenn Sie innerhalb einer Funktion (en) zu importieren, dann nehmen Sie nur den Treffer zum Laden , wenn und wenn eine dieser Funktionen wird zuerst genannt. Wie viele darauf hingewiesen haben, sparen Sie die Ladezeit, wenn dies überhaupt nicht geschieht. Aber wenn die Funktion (en) viel aufgerufen, nehmen Sie ein , obwohl viel kleiner Hit wiederholt (für die Überprüfung , dass es wurde geladen worden ist , nicht für tatsächlich Nachladen). Andererseits sparen Sie, wie @aaronasterling hervorhob, auch ein wenig, da beim Importieren innerhalb einer Funktion die Funktion etwas schnellere lokale Variablensuchen verwendet , um den Namen später zu identifizieren ( http://stackoverflow.com/questions/477096/python-). Import-Coding-Stil / 4789963 # 4789963 ).
Hier sind die Ergebnisse eines einfachen Tests, bei dem einige Dinge aus einer Funktion importiert werden. Die angegebenen Zeiten (in Python 2.7.14 auf einem Intel Core i7 mit 2,3 GHz) sind unten aufgeführt (der zweite Anruf, der mehr als spätere Anrufe entgegennimmt, scheint konsistent zu sein, obwohl ich nicht weiß, warum).
0 foo: 14429.0924 µs
1 foo: 63.8962 µs
2 foo: 10.0136 µs
3 foo: 7.1526 µs
4 foo: 7.8678 µs
0 bar: 9.0599 µs
1 bar: 6.9141 µs
2 bar: 7.1526 µs
3 bar: 7.8678 µs
4 bar: 7.1526 µs
Der Code:
from __future__ import print_function
from time import time
def foo():
import collections
import re
import string
import math
import subprocess
return
def bar():
import collections
import re
import string
import math
import subprocess
return
t0 = time()
for i in xrange(5):
foo()
t1 = time()
print(" %2d foo: %12.4f \xC2\xB5s" % (i, (t1-t0)*1E6))
t0 = t1
for i in xrange(5):
bar()
t1 = time()
print(" %2d bar: %12.4f \xC2\xB5s" % (i, (t1-t0)*1E6))
t0 = t1