Распараллеливание цикла for с использованием 2 процессоров

#python #parallel-processing #jupyter-notebook #cpu #cpu-usage

#python #параллельная обработка #jupyter-записная книжка #процессор #загрузка процессора

Вопрос:

Я запускаю цикл for большое количество раз, поэтому процесс занимает почти два с половиной часа, как и в ноутбуках Jupyter. Я надеюсь использовать два ядра для ускорения процесса, но я не знаю, как это реализовать, и все мои поиски в Google привели меня в замешательство. Раньше, когда я хотел использовать два ядра, я использовал n_jobs=2 в своей функции машинного обучения, но здесь я не делаю никакого ML, просто цикл for . Вот мой код ниже:

 ## imports
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import multiprocessing 
import time
import h5py
import time
import requests

## here is where I retrieve my data
baseUrl = 'http://www.tng-project.org/api/'
headers = {"api-key":"f3c97208f4981e63b57bb02c7135912b"}

def get(path, params=None):
    # make HTTP GET request to path
    r = requests.get(path, params=params, headers=headers)

    # raise exception if response code is not HTTP SUCCESS (200)
    r.raise_for_status()

    if r.headers['content-type'] == 'application/json':
        return r.json() # parse json responses automatically
    return r

r = get(baseUrl)

url_z1 = "http://www.tng-project.org/api/TNG100-1/snapshots/50/subhalos/?limit=10000amp;offset=0"
subhalos_z1 = get(url_z1) ## uploading my data to subhalos_z1

sub_z1 = [] ## array that contains subhalo information 
tstart = time.time()

len_sub = 10000 ## how many subhalos I want to get the information for

## for loop that retreives the data from 10000 specific subhalos 
for i in range(len_sub):
    sub_z1.append(get(subhalos_z1['results'][i]['url']))
    print(i)

print("Elapsed Time: {:.2f}s".format(time.time() - start))
 

Приведенный выше цикл for — это то, что я хочу оптимизировать, но я не знаю, с чего начать с точки зрения того, как. Любая помощь очень ценится!

Комментарии:

1. Взгляните на пакет Pandarallel, он делает именно то, что вы хотите сделать: github.com/nalepae/pandarallel

2. Сейчас я устанавливаю библиотеку и просматриваю ее. Чтобы реализовать это, я должен поместить свой цикл for в функцию, а затем запустить для него res = df.apply(func, axis=1)? Я теряюсь в части реализации этого. Я не очень опытный программист, и у меня мало формального образования, поэтому я не очень разбираюсь в функциях или распараллеливании, извините

Ответ №1:

Я все понял! Вот то, что я в итоге использовал:

 from joblib import Parallel, delayed
import math
tstart = time.time()

def func2(sub):
    sub.append(get(subhalos_z0['results'][i]['url']))
    print(i)
    return (sub)
    
Parallel(n_jobs=2)(delayed(func2)(sub_z0) for i in range(len_sub))
print("Elapsed Time: {:.2f}s".format(time.time() - start))
 

За 10 итераций использование 2 ядер сократило мое время примерно вдвое. Супер полезно! Вот ссылка на веб-сайт, который мне помог
https://www.delftstack.com/howto/python/parallel-for-loops-python /