J'ai donc mis un peu de code de test pour voir comment le module multiprocesseur évoluerait sur le travail lié cpu par rapport au threading. Sur linux je reçois l'augmentation de la performance que je pense:multiprocessing python vs threading pour le travail lié cpu sur windows et linux
linux (dual quad core xeon): serialrun took 1192.319 ms parallelrun took 346.727 ms threadedrun took 2108.172 ms
Mon pro dual core macbook montre le même comportement:
osx (dual core macbook pro) serialrun took 2026.995 ms parallelrun took 1288.723 ms threadedrun took 5314.822 ms
Je suis ensuite allé et essayé sur une machine Windows et a obtenu quelques-uns résultats très différents. Pourquoi, pourquoi l'approche multitraitement est-elle tellement plus lente sur Windows?
Voici le code de test:
#!/usr/bin/env python import multiprocessing import threading import time def print_timing(func): def wrapper(*arg): t1 = time.time() res = func(*arg) t2 = time.time() print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0) return res return wrapper def counter(): for i in xrange(1000000): pass @print_timing def serialrun(x): for i in xrange(x): counter() @print_timing def parallelrun(x): proclist = [] for i in xrange(x): p = multiprocessing.Process(target=counter) proclist.append(p) p.start() for i in proclist: i.join() @print_timing def threadedrun(x): threadlist = [] for i in xrange(x): t = threading.Thread(target=counter) threadlist.append(t) t.start() for i in threadlist: i.join() def main(): serialrun(50) parallelrun(50) threadedrun(50) if __name__ == '__main__': main()
J'ai couru votre code de test sur un quad core Dell PowerEdge 840 en cours d'exécution Win2K3, et les résultats ne sont pas aussi dramatiques que le vôtre, mais votre point reste valable: serialrun a pris 1266.000 ms parallelrun ont 1906.000 ms threadedrun a pris 4359,000 ms Je serais intéressé de voir quelles réponses vous obtiendrez. Je ne me connais pas. – Jeff