Así que noqueé algunos códigos de prueba para ver cómo el módulo de multiprocesamiento se escalaría en el trabajo vinculado a la CPU en comparación con el subprocesamiento. En Linux consigo el aumento de rendimiento que yo esperaría:python multiprocesamiento frente a subprocesos para trabajos encuadernados en cpu en Windows y Linux
linux (dual quad core xeon): serialrun took 1192.319 ms parallelrun took 346.727 ms threadedrun took 2108.172 ms
Mi pro doble núcleo macbook muestra el mismo comportamiento:
osx (dual core macbook pro) serialrun took 2026.995 ms parallelrun took 1288.723 ms threadedrun took 5314.822 ms
entonces fui y probado en una máquina de las ventanas y de algunos resultados muy diferentes.
windows (i7 920): serialrun took 1043.000 ms parallelrun took 3237.000 ms threadedrun took 2343.000 ms
¿Por qué, por qué, el enfoque de multiprocesamiento es mucho más lento en Windows?
Aquí está el código de prueba:
#!/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()
me encontré con su código de prueba en una de cuatro núcleos Dell PowerEdge 840 corriendo Win2K3, y los resultados no fueron tan dramáticos como el suyo, pero su punto sigue siendo válido: serialrun tomó 1266.000 ms parallelrun tomaron 1906.000 ms threadedrun tomó 4359.000 ms Estaré interesado en ver qué respuestas obtiene. Yo no me conozco – Jeff