Py学习  »  Python

有没有一种简单的python3方法可以在Java中实现并行for循环?

LukáÅ¡ Cyberluke Satin • 3 年前 • 996 次点击  

像这样,但我想把它弄得漂亮、干净和平行:

import collections

dataset_dict = collections.defaultdict(int)

for img, group_id in dataset:
    dataset_dict[classes[group_id]] += 1

print(dataset_dict)

我发现的最好的是python3中的Ray库,但是API的级别非常低,无法与其他现代语言媲美。随着Python中lambdas和PyTorch/Keras机器学习的蓬勃发展,以及java8以来Typescript和彻底检修的进步,我真的需要在python3中使用类似的东西。

你能为上面的代码提供一些简单的例子吗?我和雷试过了,这似乎是最简单的。但问题是在共享变量中写入增量。也许您知道python3有一个更好、更现代的API。

预期的行为是,50000个元素将按CPU的数量进行拆分。每个线程将汇总组计数,然后将结果合并为最终结果。我想在这个例子中它可能只是一个简单的Fork-Join池。我想要一个完美干净的代码,易于阅读。所以你只要读了代码,你就会得到“啊哈”的瞬间,就好像它很简单,但也很聪明,因为美就在简单中。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/99352
 
996 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Alex
Reply   •   1 楼
Alex    3 年前

Python和Java之间的一个基本区别是Python有一个 Global Interpreter Lock . 这使得用与Java类似的方式实现低层线程有点困难。

Multiprocessing

Ray是一个完全分布式的系统,因此它可以帮助跨单个机器上的核心或整个集群并行/分发python代码。对于雷,你可以用 Parallel Iterator 而不是一个列表,将你的数据集 actor . 它可能看起来像:

dataset_iter = from_items(dataset)
dataset_iter.for_each(lambda x: ray.get(dataset_dict.increment.remote(x)))
# This line starts the processing
list(dataset_iter.gather_async())

dataset_dict 看起来像

import collections
@ray.remote
class Counter:
 def __init__(self):
  self.counter = collections.Counter()

 def increment(self, key):
  self.counter[key] += 1

dataset_dict = Counter.remote()