如何在Python中获取Apple Silicon性能核心的数量?
如何在Python中获取Apple Silicon的性能/效率核心数(无需调用sysctl shell命令)
可以通过ctypes直接调用macOS的系统API sysctlbyname来实现,无需启动子进程执行shell命令,这种方法在PyInstaller打包后的应用中也能正常工作——因为ctypes是Python标准库的一部分,打包时会被自动包含。
实现代码示例
import ctypes from ctypes import c_int, c_size_t, c_char_p def get_sysctl_int(name: str) -> int: # 初始化存储结果的变量 result = c_int() result_size = c_size_t(ctypes.sizeof(result)) # 调用sysctlbyname获取系统参数值 if ctypes.CDLL(None).sysctlbyname( c_char_p(name.encode()), ctypes.byref(result), ctypes.byref(result_size), None, c_size_t(0) ) != 0: raise OSError(f"获取sysctl参数 {name} 失败") return result.value # 获取性能核心(Performance Cores,对应perflevel0)的逻辑核心数 perf_core_count = get_sysctl_int("hw.perflevel0.logicalcpu_max") # 获取效率核心(Efficiency Cores,对应perflevel1)的逻辑核心数 eff_core_count = get_sysctl_int("hw.perflevel1.logicalcpu_max") print(f"性能核心数: {perf_core_count}") print(f"效率核心数: {eff_core_count}")
代码说明
sysctlbyname是macOS原生系统函数,用于通过参数名称获取系统控制信息,我们通过ctypes.CDLL(None)直接加载系统库调用它,完全不需要依赖外部进程。- 封装的
get_sysctl_int函数统一处理参数编码、内存分配和错误判断,简化了不同sysctl参数的调用流程。 - 这种方法没有额外开销,兼容性强,PyInstaller打包后无需额外配置即可运行。
补充说明
部分新版本的psutil库已经支持识别Apple Silicon的核心架构,但如果需要精准区分性能/效率核心,还是需要依赖sysctl的相关参数——上面的ctypes实现是最直接的原生方案,不需要额外安装第三方库。
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

