He decidido aprender cómo se hace el multi-threading en Python, e hice una comparación para ver qué tipo de ganancia de rendimiento obtendría en una CPU de doble núcleo. Descubrí que mi código simple multiproceso realmente funciona más lento que el equivalente secuencial, y no puedo entender por qué.Enlazado de Python inesperadamente más lento
La prueba me las ingenié era generar una larga lista de números al azar y luego imprimir la máxima
from random import random
import threading
def ox():
print max([random() for x in xrange(20000000)])
ox()
dura aproximadamente 6 segundos para completar en mi Intel Core 2 Duo, mientras ox();ox()
toma unos 12 segundos.
Intenté llamar a ox() desde dos hilos para ver qué tan rápido se completaba.
def go():
r = threading.Thread(target=ox)
r.start()
ox()
go()
toma alrededor de 18 segundos para completar, con los dos resultados de impresión dentro de 1 segundo de unos de otros. ¿Por qué debería ser más lento?
Sospecho que ox()
se paraleliza automáticamente, porque si miro la pestaña de rendimiento del administrador de tareas de Windows y llamo al ox()
en mi consola de python, ambos procesadores alcanzan aproximadamente el 75% de utilización hasta que finaliza. ¿Python automáticamente paraleliza cosas como max()
cuando puede?
Vale la pena señalar que el enhebrado sigue siendo útil en Python para ciertos tipos de tareas, como las operaciones vinculadas a E/S. –