Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Peut-on écrire une property 'inline' ? Ou l'utilisation d'une property fait forcément un appel à fonction ?

+4 votes
 class A() :
     #init, ....
     @property
     def voile(self):
         return self._voile
     def scaled(self, coef) : 
         return coef*self.voile

Est-ce que la méthode A.voile() est de type fonction C inline ou bien a-t-on un vrai appel à fonction ?
Est-il possible de demander à Python qu'une property soit inline ?

demandé 22-Jul-2015 par grosdeg (136 points)
edité 22-Jul-2015 par grosdeg

pourquoi tiens-tu à ce que la property soit inline ?

Pour la performance, c'est une property invoquée 5 000 000 de fois (dans un programme de conception de parapente).
Ca pourrait être une méthode ordinaire, mais inline.

Je ne connaissais pas les "inlines" en C/C++, concept intéressant mais pas spécialement compatibles par nature avec les langages (semi-)interprétés comme Python.

3 Réponses

+8 votes
 
Meilleure réponse

Est-ce que la méthode A.voile() est de type fonction C inline ou bien
a-t-on un vrai appel à fonction ?

Le concept d'inline functions tel que defini en c/c++ n'existe pas en python. On a "un vrai appel a la fonction" comme tu dis.

Est-il possible de demander à Python qu'une property soit inline ?

Non

Si tu penses a des inlines functions tel que defini en c/c++ c'est que tu te soucies de la performance de ton programme. Et dans ce cas, je pense que tu devrais regarder du cote de Cython, ou encore cffi Ou eventuellement/, ecrire ton programme en c/c++

répondu 22-Jul-2015 par Nsukami_ (1,998 points)
sélectionné 23-Jul-2015 par grosdeg

Oui, je vais regarder du coté de Cython, PyPy, Numba ou cffi.

Les conseils, critiques, points de vue sur ces trois packages seraient bienvenus, si vous en avez une expérience.
Sachant que la simplicité de mise en œuvre sera déterminante dans notre choix.

N.B. Quand à le réécrire en C++, ça nous a pris 3 ans en Python, ça devrait faire 6 ans en C++, c'est niet ;-)

Pardon pr ma reponse tardive. Non, je n'ai jamais eu a me servir (de maniere vraiment serieuse) ni de Cython, ni de PyPy, ni de Numba, ni de cffi. Je renvoie donc vers cet article et eventuellement vers ce depot (mes premiers tatonnements avec python+rustlang)

+2 votes

Sans présumer de rien, je soulignerai juste qu'il toujours préférable de bien identifier les goulots d'étranglement par du profilage avant de se lancer dans l'optimisation d'un code. Il s'avère souvent que les pertes de temps principales ne sont pas là où on s'attend a priori.

Si ton bout de code en exemple est bien celui que tu fais tourner, as-tu vraiment un gain de temps exceptionnel en enlevant simplement la property pour accéder directement à l'attribut voulu ?

répondu 22-Jul-2015 par bubulle (2,212 points)

Un appel à fonction coûte cher (Python2.7):

>>> timeit.repeat("for i in range(30): f(i)", setup="f = lambda x: x*x")
[3.1785740852355957, 3.1750738620758057, 3.168308973312378]
>>> timeit.repeat("for i in range(30): i*i")
[1.4192068576812744, 1.3785839080810547, 1.376621961593628] 

(sachant que l'instruction
>>> timeit.repeat("for i in range(30): f(i)", setup="f = lambda x: x*x")
exécute un million de fois l'instruction entre cotes, dans le contexte précisé par setup= la liste de trois résultats représente les temps pour trois exécutions distinctes)

Je soupçonne que l'instruction a=x.b coûte plus cher si b est une property que si b est un simple attribut de x.

Je confirme que x.b sera plus cher si b est une property de la classe de x plutôt qu'un simple attribut.

Mon propos n'est pas là.
Quand je dis à mon banquier que je veux achèter un bateau et une chaîne hifi et qu'il me répond que je n'ai pas assez d'argent, renoncer à la chaîne hifi ne change pas vraiment la donne.

Le problème pour toi, c'est que le temps d'exécution de ton programme n'est pas aussi bien détaillé qu'une facture. Difficile de savoir qui coûte vraiment cher (ta property est-elle un bateau ou une chaine hifi ?). Et c'est là qu'intervient le profilage : connaitre le coût de chaque fonction d'un programme en exécution.

Si tu ne sais pas quoi utiliser, je te propose cProfile + runsnakerun qui me satisfait bien d'habitude sans être compliqué.

J'ai profilé mon programme (avec cProfile), c'est là que je me suis aperçu que l'accès à une property me coutait très cher. Non pas le coût unitaire de la chaîne hifi, mais le coût de 5000 000 de chaînes hifi.

Je me suis aussi aperçu que c'était programmé en dépit du bon sens, mais c'est une autre par de manche !!
J'en profite, comme tu me le suggère, pour jeter un œuil sur runsnakerun que je ne connais pas.

+3 votes

La réponse est, comme ça a été dit, que Python va faire un "vrai appel à fonction". Mais en réalité la question n'a pas spécialement de sens. Il n'y a que pour les langages compilés vers du natif que ça en a. Donc a part faire du Cython (ou tout autre transpiler), cela ne peut être fait. On ne peut pas "inliner" de l'interprétation.

Note au passage que même pour un langage compilé ça sert souvent à rien. L'instruction "inline" est généralement ignoré par les compilateurs qui décident de eux-même si ils doivent le faire ou pas.

répondu 23-Jul-2015 par Kje (464 points)
...