12

我想在 Python 中跨多个内核运行一个 cpu 密集型程序,并试图弄清楚如何编写 C 扩展来做到这一点。有这方面的代码示例或教程吗?

4

5 回答 5

9

您已经可以将 Python 程序分解为多个进程。操作系统已经将您的进程分配给所有内核。

做这个。

python part1.py | python part2.py | python part3.py | ... etc.

操作系统将确保该部分使用尽可能多的资源。cPickle您可以使用onsys.stdin和轻松地沿此管道传递信息sys.stdout

如果没有太多的工作,这通常会导致显着的加速。

是的——对讨厌的人来说——有可能构建一个如此折磨的算法,以至于它可能不会加速太多。但是,这通常会为最少的工作带来巨大的好处。

和。

为此目的的重组将完全匹配最大化线程并发所需的重组。所以。从无共享进程并行开始,直到您可以证明共享更多数据会有所帮助,然后转向更复杂的所有共享线程并行。

于 2010-08-18T17:10:45.400 回答
7

看看多处理。一个经常被忽视的事实是,操作系统更喜欢不全局共享数据,也不将大量线程塞进一个进程中。

如果您仍然坚持您的 CPU 密集型行为需要线程,请查看使用 C 中的 GIL的文档。这是非常有用的。

于 2010-08-18T16:59:21.157 回答
1

这是对 C 扩展的一个很好的使用。您应该搜索的关键字是Py_BEGIN_ALLOW_THREADS.

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

PS我的意思是如果你的处理已经在C中,比如图像处理,那么释放C扩展中的锁是好的。如果你的处理代码主要是Python,其他人的建议multiprocessing更好。用 C 语言重写代码以进行后台处理通常是不合理的。

于 2010-08-18T17:15:35.643 回答
-1

您是否考虑过使用诸如mpi4py之类的 python mpi 库之一?尽管 MPI 通常用于跨集群分配工作,但它在单个多核机器上运行良好。缺点是您必须重构代码以使用 MPI 的通信调用(这可能很容易)。

于 2010-08-18T16:55:50.630 回答
-2

多处理很容易。如果那还不够快,那么您的问题很复杂。

于 2010-08-18T17:16:38.093 回答