我目前在python中使用threading函数,得到了以下结果:
In [1]:
import threading
threading.activeCount()
Out[1]:
4
现在在我的终端上,我使用lscpu并了解到每个内核有2个线程,我可以访问4个内核:
kitty@FelineFortress:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Stepping: 3
CPU MHz: 800.000
BogoMIPS: 5786.45
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7
因此,我应该有超过4个线程来访问。有没有一个python函数可以用来增加我正在使用的内核数量(举个例子)来获得超过4个线程?或者在启动ipython笔记本时在终端上键入的内容,如下所示:
ipython notebook n_cores=3
您可以使用multiprocessing来允许Python使用多个核心。只有一个重要的警告:在Python会话之间传递的所有数据都必须是可挑选的或通过继承传递的,并且一个新的Python实例是在Windows上生成的,而在Unix系统上则可以派生出来。这对Windows系统的性能有显著影响。
使用多处理的基本example如“本周的Python模块”所示:
执行时,输出:
多处理允许您在不同的内核上进行独立的计算,从而使CPU绑定的任务在很少的开销下比传统进程执行得快得多。
您还应该认识到,Python中的线程并不能提高性能。它的存在是为了方便(例如在长时间计算期间保持GUI的响应性)。原因是,由于Python的全局解释器锁或GIL,这些线程不是本机线程。
2018年2月更新
这仍然是非常适用的,并将在可预见的未来。Cpython实现使用以下definition进行引用计数:
值得注意的是,这是而不是线程安全的,因此必须实现全局解释器锁,以便只允许使用一个Python对象执行线程,以避免导致内存问题的数据竞争。
除了多处理(在Windows上需要解释器的完整副本,而不是fork)之外,还有许多工具试图绕过全局解释器锁,这使得它非常慢,而且无法提高性能。
赛松
你最简单的解决方案是Cython。简单地cdef一个没有任何内部对象的函数,并使用
with nogil
关键字释放GIL。一个来自documentation的简单示例,它向您展示了如何释放并临时重新启用GIL:
使用不同的解释器
CPython有一个GI,而Jython和IronPython没有。小心,因为许多用于高性能计算的C库可能无法与IronPython或Jython一起工作(SciPy曾与IronPython支持打过交道,但很早以前就放弃了它,而且在现代Python版本上也无法工作)。
使用MPI4Py
MPI或消息传递接口是C语言和C++语言的高性能接口。它允许高效的并行计算,MPI4Py为Python的MPI创建绑定。为了提高效率,应该只对NumPy数组使用MPI4Py。
他们documentation的一个例子是:
相关问题 更多 >
编程相关推荐