8
votes

J'ai besoin d'accélérer une fonction. Devrais-je utiliser Cython, CTTPES ou autre chose?

Je suis très amusant d'apprendre Python en écrivant un type d'application de programmation génétique.

J'ai eu un excellent conseil de Torsten Marek, Paul Hankin et Alex Martelli sur ce site.

Le programme a 4 fonctions principales:

  • génère (au hasard) un arbre d'expression.
  • Évaluez la forme physique de l'arborescence
  • crossbreed
  • MUTATE

    Comme tout acheminez, croise et mutate, appelez «évaluer la condition physique». C'est la fonction la plus occupée et est le premier goulot d'étranglement.

    Telle est la nature des algorithmes génétiques, il doit rechercher une immense solution de solution, donc plus vite le mieux. Je veux accélérer chacune de ces fonctions. Je vais commencer par l'évaluateur de fitness. Ma question est la meilleure façon de le faire. J'ai regardé dans Cython, CTTPES et "reliant et incorporation". Ils sont tous nouveaux pour moi et bien au-delà de moi pour le moment, mais j'ai hâte d'en apprendre un et d'éventuellement tous.

    La «fonction de fitness» doit comparer la valeur de l'arborescence d'expression à la valeur de l'expression cible. Il s'agira donc d'un évaluateur postfix qui lira l'arborescence dans un ordre postfix. J'ai tout le code dans Python.

    J'ai besoin de conseils sur lesquels je devrais apprendre et utiliser maintenant: Cython, CTTYPES ou liaison et incorporation.

    merci.


0 commentaires

4 Réponses :


0
votes

Une autre excellente option est boost :: python qui vous permet d'envelopper facilement C ou C ++.

de ces possibilités, car vous avez déjà écrit du code Python, Cython est probablement une bonne chose à essayer d'abord. Peut-être que vous n'aurez pas à réécrire de code pour obtenir un enregistrement.


1 commentaires

Oui, j'en ai entendu parler. Cela signifie que je devrais apprendre assez C pour écrire les fonctions qui y sont probablement une bonne idée.



3
votes

Cyron est le plus rapide pour obtenir le travail, soit en écrivant votre algorithme directement à Cyron, soit en l'écrivant en C et en l'écrivant à Python avec Cyron.

Mon conseil: apprendre Cython.


1 commentaires

Cython a fait appel le plus pour moi, mais serait-ce le plus rapide?



15
votes

ignorer tout le monde est la réponse d'Elesdes pour l'instant. La première chose que vous devriez apprendre à utiliser est le profileur. Python est livré avec un profil / CProfile; Vous devriez apprendre à lire les résultats et à analyser où se trouve les vrais goulots d'étranglement. L'objectif de l'optimisation est trois fois: réduire le temps passé à chaque appel, réduisez le nombre d'appels à effectuer et réduire l'utilisation de la mémoire pour réduire les débits de disque.

Le premier objectif est relativement facile. Le profileur vous montrera les fonctions les plus fastidieuses et vous pouvez aller directement à cette fonction pour l'optimiser.

Le deuxième et troisième objectif est plus difficile car cela signifie que vous devez modifier l'algorithme pour réduire la nécessité de faire autant d'appels. Trouvez les fonctions qui ont un grand nombre d'appels et essayez de trouver des moyens de réduire la nécessité de les appeler. Utilisez les collections intégrées, elles sont très bien optimisées.

Si vous faites beaucoup de traitement de numéros et de matrices, vous devez jeter un coup d'œil aux pandas, numpy / scipe, modules tiers GMPY; Ils sont des bibliothèques C optimisées pour les matrices de traitement / données tabulaires.

Une autre chose que vous voulez essayer est pyypy. Pypy peut JIT recompiler et faire une optimisation beaucoup plus avancée que CPPHON, et cela fonctionnera sans la nécessité de changer votre code Python. Bien que l'optimisation du code ciblant CPPHon peut sembler assez différente du code optimisé ciblant le Pypy.

Suivant pour essayer est Cyron. Cython est une langue légèrement différente que Python, en fait Cython est en fait mieux décrit comme C avec la syntaxe typée de type Python.

Pour les parties de votre code qui se trouve dans des boucles très serrées que vous ne pouvez plus optimiser en utilisant d'autres manières, vous voudrez peut-être la réécrire comme une extension C. Python a un très bon soutien pour s'étendre avec C. en Pypy, le meilleur moyen d'étendre le Pypy est avec CFFI.


3 commentaires

Lorsque vous utilisez le profil de Python ou le CProfile, une chose que je trouve vraiment pratique et utile est un outil visulant pour me permettre de voir les chiffres schématisés. Mon préféré est Runsnakerun. Cela nécessite WXPython et quelques autres dépendances. Le fonctionnement sur votre sortie CPROFILE produit une gui-carrée-trucy, où chaque fonction est dessinée sous forme de rectangle, dimensionné par (moyen ou cumulatif) time prise dans cette fonction et englobant des rectors pour les fonctions qu'il appelle. Rend la compréhension de la sortie du profil une brise.


Utilisez PSYCO avec prudence. C'est stimulé et mort. Veuillez consulter Pypy pour la pointe de la technologie des compilateurs JIT pour Python.


@Talhajunaid: J'ai mis à jour la réponse pour désendrire le PSYCO obsolète et suggérer Pypy.



0
votes

Essayez de travailler votre fonction de fitness afin qu'elle puisse supporter la mémoire de mémoisation. Cela remplacera tous les appels qui sont des doublons d'appels précédents avec une recherche rapide de dict.


0 commentaires