我将遇到什么并行化问题?

我将需要在
python中对以下代码进行多线程以进行作业(将其转换为伪代码).我只是想在开始之前看看我的解决方案是否遗漏了什么.

L = [2, 3, 4, ...]
sums = [0, 0, 0, ...]
for item in L:
     sums[hash(item)] += func(item)

我的解决方案是将语句拆分为for循环:将’item’变量保存在临时变量中,每当我执行此操作时锁定L,然后将信息散列(temp_item)和func(temp_item)计算为更多临时变量.然后锁定L并更新它.

这是最好的解决方案吗?仅在我拍摄或更新时锁定变量.

这更多是关于正确学习并行性而不是python的局限性.

最佳答案 您将遇到的问题取决于您如何实现线程.

大的那个:

>由于全局解释器锁(GIL),Python不会像您期望的那样执行线程.任何Python对象被修改时都必须获取此锁.因此,Python线程无法使代码更快,因为所有线程实际上都是由GIL序列化的.它们仅适用于I / O或GUI绘图等.如果你想要性能线程看看multiprocessing这是相关但不同的东西.

让我们假装:

>如果您锁定总和,那么每当您对任何元素进行任何类型的修改时,您基本上都会序列化所有线程,并且您将看不到任何并行性.
>在循环内部执行锁定意味着锁本身可能比计算更昂贵.您可能看不到并行代码获得任何东西.如果func非常昂贵,这是值得的.
>您不需要锁定L,因为您只能读取它.多个线程可以安全地读取同一块内存.只有写入是危险的.

所以我基本上告诉你,你需要以某种方式锁定总和,但你不能,因为每种方法都很慢.对性能所做的是每个线程在其工作时都有自己的总和,然后当线程完成时,将所有线程的副本组合回一个总和.

点赞