gpt4 book ai didi

python - 我会遇到哪些并行化问题?

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:19 27 4
gpt4 key购买 nike

我需要在 python 中对以下代码进行多线程处理(将其转换为伪代码)。我只是想在开始之前看看我的解决方案是否缺少任何内容。

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

我的解决方案是在for循环中拆分语句:将'item'变量保存在临时变量中,每当我这样做时锁定L,然后计算信息hash(temp_item)和func(temp_item)到更多临时变量。然后锁定L并更新它。

这是最好的解决方案吗?仅在获取或更新时锁定变量。

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

最佳答案

您将遇到的问题取决于您如何实现线程。

大的:

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

不过,让我们假装:

  • 如果您锁定 sums,那么任何时候您对任何元素进行任何类型的修改时,您基本上都会序列化所有线程,您将看不到任何并行性。
  • 在循环内加锁意味着加锁本身可能比计算更昂贵。您可能看不到并行代码有任何收获。这仅在 func 非常昂贵时才值得。
  • 您不需要锁定L,因为您只是从中读取。多个线程可以安全地读取同一 block 内存。只有写入是危险的。

所以我基本上告诉过你,你需要以某种方式锁定sums,但你不能这样做,因为每种方法都很慢。为提高性能所做的工作是让每个线程在工作时都有自己的,然后当线程完成时,您将所有线程的副本组合回一个

关于python - 我会遇到哪些并行化问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com