Question

Pour mon emploi actuel, je suis en train d'écrire une longue durée (pensez heures à quelques jours) des scripts qui font CPU intensive de traitement des données. Le déroulement du programme est très simple - il se déroule dans la boucle principale, complète la boucle principale, sauve la sortie et se termine: La structure de base de mes programmes ont tendance à être comme ceci:

<import statements>
<constant declarations>

<misc function declarations>

def main():
   for blah in blahs():
      <lots of local variables>
      <lots of tightly coupled computation>

      for something in somethings():
          <lots more local variables>
          <lots more computation>

   <etc., etc.>

   <save results>

if __name__ == "__main__":
    main()

Cela devient rapidement ingérable, donc je veux le factoriser en quelque chose de plus facile à gérer. Je veux rendre plus maintenable, sans sacrifier la vitesse d'exécution.

Chaque mandrin code repose sur un grand nombre de variables cependant, refactoring si les parties du calcul sur des fonctions rendrait la liste des paramètres se développer hors de la main très rapidement. Dois-je mettre ce genre de code dans une classe de python, et modifier les variables locales dans les variables de classe? Il ne fait pas beaucoup de sens tp me conceptuellement de tourner le programme dans une classe, que la classe ne sera jamais réutilisé, et une seule instance serait jamais créé par exemple.

Quelle est la meilleure structure de la pratique pour ce genre de programme? J'utilise python, mais la question est relativement langue agnostique, en supposant une des caractéristiques de langage orienté objet moderne.

Était-ce utile?

La solution

Tout d'abord, si votre programme va être en cours d'exécution pendant des heures / jours, puis les frais généraux de passage à l'aide de classes / méthodes au lieu de mettre tout dans un principal géant est à peu près inexistante.

En outre, la refactorisation (même si elle ne comporte le passage d'un grand nombre de variables) devrait vous aider à améliorer la vitesse à long terme. Le profilage d'une application qui est bien conçu est beaucoup plus facile parce que vous pouvez épingler point les parties lentes et optimisons là. Peut-être une nouvelle bibliothèque vient que de très optimisés pour vos calculs ... un programme bien conçu vous permettra de le brancher et tester tout de suite. Ou peut-être vous décidez d'écrire une extension C Module pour améliorer la vitesse d'un sous-ensemble de vos calculs, une application bien conçue fera facile aussi.

Il est difficile de donner des conseils concrets sans voir <lots of tightly coupled computation> et <lots more computation>. Mais, je voudrais commencer par faire chaque bloc de for sa propre méthode et aller de là.

Autres conseils

Pas trop propre, mais fonctionne bien dans de petits projets ...

Vous pouvez commencer à utiliser des modules comme si elles étaient des instances singletons, et créer des classes réelles que lorsque vous vous sentez la complexité du module ou les justifie de calcul eux.

Si vous faites cela, vous voulez utiliser « module d'importation » et non « de choses à l'importation du module » - il est plus propre et fonctionnera mieux si l'on peut être réaffecté « trucs ». En outre, il est recommandé dans les lignes directrices Google.

Utilisation d'une classe (ou classes) peut vous aider à organiser votre code. La simplicité de la forme (par exemple, par l'utilisation des attributs de classe et méthodes) est importante car elle vous permet de voir votre algorithme, et peut vous aider à l'unité plus facilement tester les pièces.

OMI, ces avantages l'emportent largement sur la légère perte de vitesse qui peut venir à l'utilisation POO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top