Распараллеливание цикла for с использованием функции многопроцессорного пула - PullRequest
0 голосов
/ 05 июня 2018

Я пытался следовать примеру @ this location:

[ Как использовать многопоточность в Python?

У меня есть примерный фрейм данных (df), подобный этому:

segment x_coord y_coord
a   1   1
a   2   4
a   1   7
b   2   3
b   4   3
b   8   3
c   4   4
c   2   5
c   7   8

и создание дерева kd с использованием цикла for для каждого из сегментов в цикле, как показано ниже:

dist_name=df['segment'].unique()
for i in range(len(dist_name)):
    a=df[df['segment']==dist_name[i]]
    tree[i] = spatial.cKDTree(a[['x_coord','y_coord']])

Как можно распараллелить создание дерева, используя образец, видимый в ссылке, какниже:

results = [] 
for url in urls:
  result = urllib2.urlopen(url)
  results.append(result)

Распараллелить на >>

pool = ThreadPool(4) 
results = pool.map(urllib2.urlopen, urls)

Моя попытка

import pandas as pd
import time
from scipy import spatial
import random
from multiprocessing.dummy import Pool as ThreadPool 


dist_name=['a','b','c','d','e','f','g','h']

df=pd.DataFrame()

for i in range(len(dist_name)):
    if i==0:
       df['x_coord']=random.sample(range(1, 10000), 1000)
       df['y_coord']=random.sample(range(1, 10000), 1000)
       df['segment']=dist_name[i]
    else:
       tmp=pd.DataFrame()
       tmp['x_coord']=random.sample(range(1, 10000), 1000)
       tmp['y_coord']=random.sample(range(1, 10000), 1000)
       tmp['segment']=dist_name[i]
       df=df.append(tmp)



start_time = time.time()
for i in range(len(dist_name)):
    a=df[df['segment']==dist_name[i]]
    tree = spatial.cKDTree(a[['x_coord','y_coord']])

print("--- %s seconds ---" % (time.time() - start_time))

--- 0.0312347412109375 секунд ---

def func(name):
    a = df[df['segment'] == name]
    return spatial.cKDTree(a[['x_coord','y_coord']])

pool = ThreadPool(4) 

start_time = time.time()
tree = pool.map(func, dist_name)
print("--- %s seconds ---" % (time.time() - start_time))

--- 0,031250953674316406 секунд ---

1 Ответ

0 голосов
/ 05 июня 2018

Ваш код:

dist_name=df['segment'].unique()
for i in range(len(dist_name)):
    a=df[df['segment']==dist_name[i]]
    tree[i] = spatial.cKDTree(a[['x_coord','y_coord']])

Необходимо преобразовать в:

dist_name=df['segment'].unique()

def func(name):
    a = df[df['segment'] == name]
    return spatial.cKDTree(a[['x_coord','y_coord']])

И ваш звонок pool.map:

pool = ThreadPool(4) 
tree = pool.map(func, dist_name)
...