J'ai été surpris de ne pas voir les chiffres des coûts réels pour les contrôles de charge répétés déjà publiés, bien qu'il existe de nombreuses bonnes explications sur ce à quoi s'attendre.
Si vous importez en haut, vous prenez la charge de charge quoi qu'il arrive. C'est assez petit, mais généralement en millisecondes, pas en nanosecondes.
Si vous importez dans une ou plusieurs fonctions, vous ne prenez le coup pour le chargement que si et quand une de ces fonctions est appelée pour la première fois. Comme beaucoup l'ont souligné, si cela ne se produit pas du tout, vous économisez le temps de chargement. Mais si la ou les fonctions sont souvent appelées, vous prenez un coup répété mais beaucoup plus petit (pour vérifier qu'elle a été chargée; pas pour le recharger réellement). D'autre part, comme l'a souligné @aaronasterling, vous économisez également un peu car l'importation dans une fonction permet à la fonction d'utiliser des recherches de variables locales légèrement plus rapides pour identifier le nom plus tard ( http://stackoverflow.com/questions/477096/python- import-coding-style / 4789963 # 4789963 ).
Voici les résultats d'un test simple qui importe quelques éléments de l'intérieur d'une fonction. Les temps signalés (en Python 2.7.14 sur un Intel Core i7 à 2,3 GHz) sont indiqués ci-dessous (le deuxième appel prenant plus que les appels ultérieurs semble cohérent, mais je ne sais pas pourquoi).
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
Le 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