J'ai trouvé cette question parce que je voulais poser la question de savoir pourquoi il y a un impact sur les performances si on utilise des fonctions imbriquées. J'ai effectué des tests pour les fonctions suivantes en utilisant Python 3.2.5 sur un ordinateur portable Windows avec un processeur Quad Core 2.5 GHz Intel i5-2530M
def square0(x):
return x*x
def square1(x):
def dummy(y):
return y*y
return x*x
def square2(x):
def dummy1(y):
return y*y
def dummy2(y):
return y*y
return x*x
def square5(x):
def dummy1(y):
return y*y
def dummy2(y):
return y*y
def dummy3(y):
return y*y
def dummy4(y):
return y*y
def dummy5(y):
return y*y
return x*x
J'ai mesuré les éléments suivants 20 fois, également pour le carré 1, le carré 2 et le carré 5 :
s=0
for i in range(10**6):
s+=square0(i)
et j'ai obtenu les résultats suivants
>>>
m = mean, s = standard deviation, m0 = mean of first testcase
[m-3s,m+3s] is a 0.997 confidence interval if normal distributed
square? m s m/m0 [m-3s ,m+3s ]
square0 0.387 0.01515 1.000 [0.342,0.433]
square1 0.460 0.01422 1.188 [0.417,0.503]
square2 0.552 0.01803 1.425 [0.498,0.606]
square5 0.766 0.01654 1.979 [0.717,0.816]
>>>
square0
n'a pas de fonction imbriquée, square1
a une fonction imbriquée, square2
a deux fonctions imbriquées et square5
comporte cinq fonctions imbriquées. Les fonctions imbriquées sont seulement déclarées mais pas appelées.
Ainsi, si vous avez défini 5 fonctions imbriquées dans une fonction que vous n'appelez pas, le temps d'exécution de la fonction est le double de celui de la fonction sans fonction imbriquée. Je pense qu'il faut être prudent lors de l'utilisation de fonctions imbriquées.
Le fichier Python pour l'ensemble du test qui génère cette sortie se trouve à l'adresse suivante idéone .
8 votes
Vous ne devriez pas avoir besoin de définir une fonction à l'intérieur d'une autre, à moins que vous ne fassiez quelque chose de VRAIMENT funky. Cependant, veuillez préciser ce que vous essayez de faire, afin que nous puissions vous fournir une réponse plus utile.
6 votes
Vous réalisez que le second exemple est différent, parce que vous n'avez pas appelez
method_b
? (@inspector : Vous devez le faire, à proprement parler, mais c'est immensément utile lorsque vous vous lancez dans la programmation fonctionnelle, en particulier les fermetures).3 votes
@delnan : Je pense que vous vouliez dire "Vous Ne le fais pas. pas besoin, à proprement parler, mais..."
0 votes
Comme @delnan l'a mentionné, c'est courant dans le cas des fermetures, donc je ne pense pas que cela puisse être qualifié de funky ; cependant, à moins que les fermetures soient nécessaires (ce qui n'est pas le cas dans ce cas), mettre une fonction à l'intérieur d'une autre ne semble pas nécessaire, efficace ou ordonné. À moins que vous n'ayez besoin de fermetures, je m'en tiendrais au premier modèle.
5 votes
Les cas d'utilisation des fonctions internes sont merveilleusement résumés en lien : https://realpython.com/blog/python/inner-functions-what-are-they-good-for/ . Si votre utilisation ne correspond à aucun de ces cas, il vaut mieux l'éviter.
0 votes
Cela répond-il à votre question ? Comment faire une chaîne de décorateurs de fonctions ?