Le code Python de la diminution des performances avec filetage

J'ai écrit un programme en Python qui, en gros, analyse d'un lot de fichiers binaires, extraire les données dans une structure de données. Chaque fichier prend environ une seconde à l'analyse, ce qui se traduit par des heures pour des milliers de fichiers. J'ai mis en œuvre avec succès une version filetée du lot méthode d'analyse avec un réglage nombre de threads. J'ai testé la méthode sur 100 fichiers avec un nombre variable de fils, le calendrier de chaque course. Voici les résultats (0 threads se réfère à mon origine, de pré-filetage code, 1 fils de la nouvelle version fonctionne avec un seul thread généré).

0 threads: 83.842 seconds
1 threads: 78.777 seconds
2 threads: 105.032 seconds
3 threads: 109.965 seconds
4 threads: 108.956 seconds
5 threads: 109.646 seconds
6 threads: 109.520 seconds
7 threads: 110.457 seconds
8 threads: 111.658 seconds

Bien que la fraie un fil lui confère une petite augmentation de la performance sur avoir le thread principal de faire tout le travail, en augmentant le nombre de threads en fait diminue performance. Je me serais attendu à voir la performance augmente, au moins jusqu'à quatre fils (un pour chacun de mes machine cœurs). Je sais que les threads sont associés dessus, mais je ne pense pas que cela a beaucoup d'importance avec les nombres à un chiffre de threads.

J'ai entendu parler de la "global interprète de verrouillage", mais comme je l'ai déplacer jusqu'à quatre fils, je ne vois que le nombre de cœurs au travail--avec deux fils de deux cœurs d'activité au cours de l'analyse, et ainsi de suite.

J'ai aussi testé quelques versions différentes de l'analyse de code pour voir si mon programme est IO lié. Il ne semble pas être; il suffit de lire dans le fichier prend une proportion relativement faible de temps; le traitement du fichier est presque tout. Si je ne fais pas les IO et les processus déjà lu la version d'un fichier, je l'ajout d'un deuxième thread dommages performance et un troisième fil améliore légèrement. Je me demandais simplement pourquoi je ne peux pas profiter de mon ordinateur plusieurs cœurs pour accélérer les choses. S'il vous plaît poster des questions ou des façons que je pourrais clarifier.

  • Le GIL est probablement en faute. Vous pouvez regarder dans le module multiprocessing, comme une alternative à l'enfilage module, car il procure un vrai simultanéité où le GIL empêche pour l'enfilage.
  • Jetez un oeil à ceci. Vous avez rencontré la seule chose que je déteste à propos de Python (bien, Disponible de toute façon).
  • Plusieurs cœurs d'activité, mais c'est juste de la commutation entre eux - seuls un Python thread peut s'exécuter à la fois. Vous avez besoin de multitraitement: docs.python.org/dev/library/multiprocessing
  • Votre programme peut réellement montrer une amélioration de la vitesse, si elle était liée aux e/S, comme I/O est un temps lorsque Disponible permet à d'autres threads s'exécutent.
  • Je vais regarder dans l'aide de multitraitement; je suis en cours d'exécution Python 2.4, donc je vais avoir besoin de mettre à niveau la première raison pour laquelle le filetage m'intéressait. Je pensais que le multitraitement était juste un plus haut niveau de la coquille autour du filetage/thread. Quel est le point de filetage, alors? Et je ne suis toujours pas sûr de comprendre pourquoi plusieurs threads serait de ralentir mon programme, est-ce juste le fil dessus?
  • Ne pouvez-vous pas faire de l'analyse syntaxique en C? Si les choses sont le CPU à un interprète, ils pleurent pour un compilateur de langage. Un programme qui vient de traite doivent être dépendant des e/S, pas de CPU.
  • Les fichiers binaires sont assez complexes et j'ai écrit certains modérément complexe d'objets pour contenir les données de sorte qu'il peut facilement être renvoyé à plus tard. Pas sûr que je pourrais en apprendre assez C/Python intégration dans les quatre prochaines semaines (avant mon stage est terminé) à gérer cela.
  • Threading est toujours utile si vous avez quelque chose comme le blocage des requêtes HTTP. Et il utilise un peu moins de mémoire. Mais de nos jours, le multitraitement voit plus l'utilisation.
  • double possible de Quelle est l'efficacité de filetage en Python?

InformationsquelleAutor dpitch40 | 2011-07-25