Python 如何以跨系统的方式将进程仅绑定到物理核心?

Python 如何以跨系统的方式将进程仅绑定到物理核心?,python,python-3.x,cross-platform,z3,hyperthreading,Python,Python 3.x,Cross Platform,Z3,Hyperthreading,我使用的是,你增加了40%到60%的开销。由于超线程将性能提高到最大30%,这意味着程序在超线程系统上的运行速度低于单线程模式 第一步似乎很简单 通过len(os.sched\u getaffinity(0)) 通过z3参数限制线程数 使用os.sched\u setaffinity(0,mask)将线程绑定到物理内核 在platform.machine()中为不包含Intel或amd的系统启用smt解决方案 然而,这样做会产生一些问题 如何知道系统是否启用了超读功能 在使用os.sche

我使用的是,你增加了40%到60%的开销。由于超线程将性能提高到最大30%,这意味着程序在超线程系统上的运行速度低于单线程模式

第一步似乎很简单

  • 通过
    len(os.sched\u getaffinity(0))

  • 通过z3参数限制线程数

  • 使用
    os.sched\u setaffinity(0,mask)
    将线程绑定到物理内核

  • platform.machine()
    中为不包含Intel或amd的系统启用smt解决方案

然而,这样做会产生一些问题

  • 如何知道系统是否启用了超读功能

  • 在使用os.sched_setaffinity(0,mask)之前,如何知道哪些cpu核心号是物理的还是逻辑的

问题是该程序目前通过python3支持多种平台:所有unix,以及Windows、Osx和Openvms,同时不忘PyPy

任何修复问题的补丁都不应该产生新的进程,也不应该添加不包含的依赖项,也不应该放弃对上述某些平台的支持


有什么干净的方法可以解决这个问题?

包含了一个可移植的解决方案。它确实会生成一个进程,然后缓存结果——所以不像您多次生成一个进程。考虑到这是一个支持流行库(如
sklearn
)的解决方案,我猜它几乎和它得到的一样好。

请参阅@VladimirBershov,它在Openvms上不受支持,因此不支持跨平台。我认为在目前的情况下,解决方案应该是基于纯python的。@PatrickTrentin但这是一个python问题!不是C++。@ PATRKTrTin项目本身目前不使用二进制代码。我怀疑他们会接受这样一个补丁。就性能而言,这对PyPy来说也是一个问题。@user2284570您是否考虑过
psutil.cpu\u count(logical=False)
,或者您的一些平台不支持它?它使用lscpu。一个在Openvms和Windows上不存在的实用程序。它有一个Windows替代程序。我相信您可以添加另一个elif来处理openvms。如果你找到一个更好的解决方案,你肯定应该考虑把它贡献给洛基。