Sono stato sorpreso di non vedere i numeri di costo effettivi per i ripetuti controlli di carico già pubblicati, anche se ci sono molte buone spiegazioni su cosa aspettarsi.
Se si importa in alto, si prende il carico hit indipendentemente da cosa. È piuttosto piccolo, ma comunemente nei millisecondi, non nei nanosecondi.
Se si importa all'interno di una o più funzioni, si prende il colpo solo per il caricamento se e quando viene chiamata per la prima volta una di quelle funzioni. Come molti hanno sottolineato, se ciò non accade affatto, si risparmia il tempo di caricamento. Ma se la funzione (s) vengono chiamati un sacco, si prende un ripetuto anche se molto più piccolo colpo (per controllare che esso è stato caricato, non per realtà ri-carico). D'altra parte, come ha sottolineato @aaronasterling, si risparmia anche un po 'perché l'importazione all'interno di una funzione consente alla funzione di utilizzare ricerche di variabili locali leggermente più veloci per identificare il nome in un secondo momento ( http://stackoverflow.com/questions/477096/python- import-coding-style / 4789963 # 4789963 ).
Ecco i risultati di un semplice test che importa alcune cose dall'interno di una funzione. I tempi riportati (in Python 2.7.14 su un Intel Core i7 a 2,3 GHz) sono mostrati di seguito (la seconda chiamata che prende più di chiamate successive sembra coerente, anche se non so perché).
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
Il codice:
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