尽可能快地进行嵌套循环

问题描述 投票:0回答:1
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 分钟的相同结果。

python-3.x
1个回答
0
投票

使用

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() 为您提供硬件拥有的核心数量)。

这就是要点。

如果是一次性计算就足够了。但更快(更好)的方法是使用 numpy例如参见这个

© www.soinside.com 2019 - 2024. All rights reserved.