【发布时间】:2017-06-06 11:23:21
【问题描述】:
我有一个目前非常慢且 CPU 很重的程序,我对如何并行化它感到困惑。
我的问题:
算法是这样工作的(使用随机数):
import numpy as np
import scipy.spatial as spatial
from collections import Counter
# Particle dictionary
num_parts = int(1e4)
particles = {'coords': np.random.rand(num_parts, 3),
'flags': np.random.randint(0, 4, size=num_parts)}
# Object dictionary
num_objects = int(1e3)
objects_dict = {'x': [np.random.rand(1)
for i in range(0, num_objects)],
'y': [np.random.rand(1)
for i in range(0, num_objects)],
'z': [np.random.rand(1)
for i in range(0, num_objects)],
'prop_to_calc': [np.array([])
for i in range(0, num_objects)]}
# Build KDTree for particles
tree = spatial.cKDTree(particles['coords'])
# Loop through objects to calculate 'prop_to_calc' based
# on nearby particles flags within radius, r.
r = 0.1
for i in range(0, num_objects):
# Find nearby indices of particles.
indices = tree.query_ball_point([objects_dict['x'][i][0],
objects_dict['y'][i][0],
objects_dict['z'][i][0]],
r)
# Extract flags of nearby particles.
flags_array = particles['flags'][indices]
# Find most common flag and store that in property_to_calculate
c = Counter(flags_array)
objects_dict['prop_to_calc'] = np.append(objects_dict['prop_to_calc'],
c.most_common(1)[0][0])
有两个数据集particles 和objects_dict。我想通过搜索半径内的附近粒子r 并找到它们最常见的标志来计算objects_dict['prop_to_dict']。这是通过cKDTree 和query_ball_point 完成的。
对于这些数字,时间是:
10 loops, best of 3: 55.8 ms per loop 在 Ipython 4.2.0 中
但是,我想要num_parts=1e6 和num_objects=1e5,这会导致速度严重下降。
我的问题:
由于 CPU 很重,我想尝试并行化它以加快速度。
我查看了multiprocessing 和multi threading。但是文档让我很困惑,我不确定如何将示例应用于此问题。
具体来说,我关心的是如何在进程之间共享这两个字典并在最后写入objects_dict。
提前感谢您的帮助。
【问题讨论】:
-
如果你想要速度,试试 python 编译器 Cython 或者只用 C(++) 编写你的程序。
-
我考虑过 Cython。但是,我想先看看是否可以在我的示例中使用并行计算。
标签: python python-multithreading python-multiprocessing