Python线程意外地变慢了

Nat*_*han 5 python parallel-processing multithreading

我已经决定学习如何在Python中完成多线程,我做了一个比较,看看我会在双核CPU上获得什么样的性能提升.我发现我的简单多线程代码实际上比顺序等效运行得慢,我无法弄清楚原因.

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

from random import random
import threading

def ox():
    print max([random() for x in xrange(20000000)])
Run Code Online (Sandbox Code Playgroud)

ox()我的英特尔酷睿2双核处理器需要大约6秒才能完成,ox();ox()大约需要12秒.

然后我尝试从两个线程调用ox()来查看完成的速度有多快.

def go():
    r = threading.Thread(target=ox)
    r.start()
    ox()
Run Code Online (Sandbox Code Playgroud)

go()大约需要18秒才能完成,两个结果在1秒内完成打印.为什么这会慢?

我怀疑ox()是自动并行化,因为我查看Windows任务管理器性能选项卡,并ox()在我的python控制台中调用,两个处理器都会跳到大约75%的利用率,直到它完成.Python会自动将事物并行化max()吗?

Yan*_*min 9

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

您需要使用多进程框架来与Python并行化.幸运的是,随Python一起提供的多处理模块使得相当容易.

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

  • 值得注意的是,对于某些类型的任务,线程在Python中仍然有用,例如I/O绑定操作. (5认同)