#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 /