Multiprocesamiento de Python: Paralelismo

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

Paralelismo con el multiprocesamiento de Python

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


Multiprocesamiento — Una de las cosas más difíciles que puede enfrentar un desarrollador es hacer que su código se ejecute más rápido (más). El problema es que muchas tareas tardan en procesarse, incluso en equipos rápidos con varios núcleos.

En parte, esto sucede debido a Python GIL (Python Global Interpreter Lock) que permite que solo un subproceso tome el control sobre Python Interpreter, por lo que nunca termina usando todo el poder de la máquina simplemente ejecutando una función o método.

¡Pero no se preocupe! Puede ocuparse de eso.

Imagine que tiene que ejecutar una función 3 veces y cada resultado devuelto compone un resultado final. Obviamente, en aras de la simplicidad, en esta publicación, los de aquí serán simples for loops que sumarán n a todos los n anteriores en un rango.

Sin multiprocesamiento (1 min y 30 s):

from datetime import datetimestart = datetime.now()
def loop(r):
    for n in range(r):
        result = (n*(n+1))/2
    return resultranges = [100000000, 200000000, 300000000]
results = []if __name__ == '__main__':
    for r in ranges:
        results.append(loop(r))    print(f’Result: {sum(results)}’)
    print(f’Time spent: {datetime.now() - start}')>>> Result: 6.99999997e+16
>>> Time spent: 0:01:30.659429
Multiprocesamiento
Uso de procesadores / núcleos sin multiprocesamiento

Ahora el siguiente paso es instalar la biblioteca psutil que nos permite establecer un núcleo específico para cada instancia de nuestra función.

Usando multiprocesamiento y psutil de forma asincrónica (0 min y 53 s):

from datetime import datetime
import multiprocessing as mp
import psutilstart = datetime.now()
def loop(core, r):
    proc = psutil.Process()
    proc.cpu_affinity([core])
    for n in range(r):
        result = (n*(n+1))/2
    return resultcores = [0, 1, 2]
ranges = [100000000, 200000000, 300000000]
results = []if __name__ == '__main__':
    with mp.Pool() as pool:
        for core in cores:
            p = pool.apply_async(func=loop, args=(core, ranges[core],))
            results.append(p)
        pool.close()
        pool.join()
result = 0for p in results:
        result = result + p.get()
    print(f’Result: {result}’)
    print(f’Time spent: {datetime.now() - start}')>>> Result: 6.99999997e+16
>>> Time spent: 0:00:53.664461

Como puede ver a continuación, se están utilizando 3 núcleos al mismo tiempo y pudimos obtener una reducción de tiempo de aproximadamente un 41%, que eventualmente aumenta si está haciendo cálculos más pesados o cargando grandes conjuntos de datos en Pandas, por ejemplo.

Multiprocesamiento
Uso de procesadores / núcleos con multiprocesamiento (primeros 3 núcleos)

¿Es posible reducir aún más el tiempo de procesamiento? Sí, es posible, pero eso quedará para otra publicación.

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]