spatial_data = [[1,2,3,4,5,6], ..... , [1,2,3,4,50,60]] #length 10 million
reference = [[9, 39, 22, 28, 25, 5], ...... , [5, 16, 12, 34, 3, 9]] # length 100
for x in reference:
result = [c for c in spatial_data if len(set(x).intersection(c)) <= 2]
每次运行将花费我的计算机大约 5 分钟,预计我需要执行此操作 1000 次,因此我预计大约需要 3.5 天。请帮我加快速度。谢谢你
我尝试以非列表理解格式编写此内容,这会产生每次运行约 5 分钟的相同结果。
使用
multiprocessing.Pool
的代码的简单并行版本将是:
from functools import partial
from multiprocessing import Pool, cpu_count
spatial_data = [...] #length 10 million
reference = [...] # length 100
def f(x, data):
return [c for c in data if len(set(x).intersection(c)) <= 2]
my_func = partial(f, data=spatial_data) #since spatial_data is the same at each iteration
with Pool(cpu_count()) as p:
result = p.map(my_func, reference)
简而言之,你定义一个小函数来进行内循环计算。 然后,使用
Pool.map()函数在 Pool() 中生成尽可能多的进程(
cpu_count()
为您提供硬件拥有的核心数量)。
这就是要点。