J'ai décidé d'apprendre comment le multi-threading est fait en Python, et j'ai fait une comparaison pour voir quel genre de gain de performance je pourrais obtenir sur un processeur dual-core. J'ai trouvé que mon code multithread simple s'exécute plus lentement que l'équivalent séquentiel, et je n'arrive pas à comprendre pourquoi.Thread Python de manière inattendue plus lent
Le test que je parvins était de générer une grande liste de nombres aléatoires, puis imprimer le maximum
from random import random
import threading
def ox():
print max([random() for x in xrange(20000000)])
ox()
prend environ 6 secondes pour terminer sur mon processeur Intel Core 2 Duo, alors que ox();ox()
prend environ 12 secondes. J'ai ensuite essayé d'appeler ox() à partir de deux threads pour voir à quelle vitesse cela se terminerait.
def go():
r = threading.Thread(target=ox)
r.start()
ox()
go()
prend environ 18 secondes pour achever, avec l'impression de deux résultats à moins de 1 seconde de eachother. Pourquoi cela devrait-il être plus lent? ox()
Je pense que ox()
est parallélisé automatiquement, parce que si je regarde l'onglet de performance du gestionnaire de tâches Windows, et appelez ox()
dans ma console python, les deux processeurs sautent à environ 75% d'utilisation jusqu'à ce qu'il se termine. Est-ce que Python parallélise automatiquement des choses comme max()
quand c'est possible?
Il est à noter que le threading est toujours utile en Python pour certains types de tâches, tels que les opérations liées aux E/S. –