如何使用多重访问来获得最高值



我正在编写一个程序,该程序必须处理大约1000名候选人,并找到最佳分数。我需要使用多处理来处理一个列表,因为这将被执行大约60000次。在这种情况下,我们将如何使用多处理。假设分数是这样计算的:

def get_score(a, b):
return (a * b) / (a + b)

我在任何情况下都知道a,但每次浏览候选人列表时,它都会发生变化,因为它会将最佳候选人添加到列表中。我希望它能遍历一个候选列表,然后找到最好的分数。非多处理示例如下:

s = [random.randint(0, 100)]
candidates = [random.randint(0, 100) for i in range(1000)]  
for i in range(60000):
best_score = 0
best_candidate = candidates[0]
for j in candidates:
if get_score(s[-1], j) > best_score:  
best_candidate = j
best_score = get_score(s[-1], j)
s.append(best_candidate)

我知道我可以创建一个函数,但我觉得有一种更简单的方法可以做到这一点。很抱歉出现初学者问题。:/

您的代码有很多不一致之处,比如没有更新best_score,仍然与0值的最佳分数进行比较。

基于嵌套循环的设计使解决方案难以并行化,而且您也没有提供更多细节,如订单重要吗

我给出了一个基于伪多处理的解决方案,它将60000范围循环并行运行到n-cpu中,并将这些解决方案写入numpy数组。然而,如何合并解决方案取决于您。

import random
import numpy as np
import multiprocessing as mp
s = [random.randint(0, 100)]
candidates = [random.randint(0, 100) for i in range(1000)]  
n_cpu = mp.cpu_count()

def get_score(a, b):
return (a * b) / (a + b)

def partial_gen(num_segment):
part_arr = []
for i in range(60000//n_cpu): # breaking the loop into n_cpu segments
best_score = 0
best_candidate = candidates[0]
for j in candidates:
new_score = get_score(s[-1], j)
if new_score > best_score:  
best_candidate = j
best_score = new_score # are you sure? you don't wanna update this?
part_arr.append(best_candidate)
part_arr = np.array(part_arr)
np.save(f'{num_segment}.npy', part_arr)
p = mp.Pool(n_cpu)
p.map(partial_gen, range(n_cpu))

加快速度的一个简单方法是使用矢量化(作为第一个优化步骤,而不是多处理(。您可以通过使用numpy ndarrays来实现这一点。

相关内容

  • 没有找到相关文章

最新更新