<p>通过使用<code>Pool.map(function, iterable)</code>将iterable(<code>w_list</code>在本例中)拆分为多个块,并对每个块应用函数,每个块使用一个线程,您将获得更好的性能</p>
<p>另一个关键的优化是不要重复调用列表上的<code>remove()</code>,因为这是一个非常昂贵的操作。相反,我们可以先存储要删除的索引列表,然后创建一个新列表</p>
<p>我已经测试了以下代码,与单线程相比,它的运行速度似乎要快得多(大约3-4倍)(您可以取消对<code>process_pool = mp.Pool(1)</code>的注释以查看差异)</p>
<pre class="lang-py prettyprint-override"><code>import multiprocessing as mp
def cost_interior(w):
budget = 299
cost = [100, 100, 100]
total_cost = 0
for item in range(0, len(w)):
if w[item] == 1:
total_cost = total_cost + cost[item]
if total_cost > budget or total_cost < (0.5 * budget):
return True
return False
def main():
process_pool = mp.Pool(mp.cpu_count())
#process_pool = mp.Pool(1)
w_list = [[1, 0, 1], [1, 1, 0], [1, 1, 1]]
w_list = w_list*1000000
should_remove = process_pool.map(cost_interior, w_list)
process_pool.close()
process_pool.join()
should_remove_indices = set()
for i in range(len(w_list)):
if should_remove[i]:
should_remove_indices.add(i)
w_list_new = []
for i in range(len(w_list)):
if i not in should_remove_indices:
w_list_new.append(w_list[i])
if __name__ == "__main__":
main()
</code></pre>