gpt4 book ai didi

Python 线程意外变慢

转载 作者:太空狗 更新时间:2023-10-30 00:42:03 27 4
gpt4 key购买 nike

我决定学习如何在 Python 中完成多线程,并且我做了一个比较,看看我在双核 CPU 上可以获得什么样的性能提升。我发现我的简单多线程代码实际上比顺序等效代码运行得更慢,我不明白为什么。

我设计的测试是生成一个大的随机数列表,然后打印最大值

from random import random
import threading

def ox():
print max([random() for x in xrange(20000000)])

ox() 在我的 Intel Core 2 Duo 上大约需要 6 秒才能完成,而 ox();ox() 大约需要 12 秒。

然后我尝试从两个线程调用 ox() 以查看完成速度。

def go():
r = threading.Thread(target=ox)
r.start()
ox()

go() 大约需要 18 秒才能完成,两个结果的打印时间相差 1 秒。为什么这应该更慢?

我怀疑 ox() 正在自动并行化,因为如果我查看 Windows 任务管理器性能选项卡,并在我的 python 控制台中调用 ox(),两者处理器的利用率会跳到大约 75%,直到它完成。 Python 会自动并行化诸如 max() 之类的东西吗?

最佳答案

  1. Python 有 GIL。 Python 字节码一次只能由一个处理器执行。只有某些 C 模块(不管理 Python 状态)才能同时运行。
  2. Python GIL 在锁定线程之间的状态方面有巨大的开销。在较新的版本或开发分支中有针对此问题的修复 - 至少应该使多线程 CPU 绑定(bind)代码与单线程代码一样快。

您需要使用多进程框架与 Python 并行化。幸运的是,multiprocessing Python 附带的模块使这相当容易。

很少有语言可以自动并行化表达式。如果这是您想要的功能,我建议使用 Haskell(Data Parallel Haskell)

关于Python 线程意外变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121109/

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