python - 为什么使用 Python 并行处理 CPU 使用率较低?
问题描述
今天是我在 python 中应用并行性的第一天
我觉得我以前在标准处理上浪费了我的时间,因为显然 ML 在并行性上要快得多。
这是我构建的第一个示例
xtrain, xval, ytrain, yval = train_test_split(X, y, test_size=0.2, random_state=1013)
mdl = LogisticRegression()
clf = OneVsRestClassifier(mdl)
y_pred = cross_val_predict(clf, X, y, cv=3)
我只是添加 n_jobs=-1
让它并行运行
所以变成了这样
y_pred = cross_val_predict(clf, X, y, cv=3, n_jobs=-1)
我对并行与不并行进行了比较
没有并行性
该过程耗时0:02:14
(2 分 14 秒)
当我查看 CPU 使用率时,它看起来像这样
具有并行性
该过程耗时 0:00:43(43 秒)
当我查看 CPU 使用率时,它看起来像这样
这清楚地表明,如果没有并行性,所有 CPU 中的 CPU 使用率都会更高
我的问题是为什么没有并行性在所有 CPU 中比并行性消耗更多的 CPU?
如果作业分布在所有 CPU 上,则应该有更多 CPU 处于忙碌状态
在没有并行性的情况下,只有一个 CPU 应该很忙,其余的则不那么忙!
这种行为的原因是什么?
另一个问题
我看到很多关于人们使用 joblib 和 dask 的例子。它太复杂了
使用 dask 和 joblib 是否比仅添加 n_jobs 提供更快的结果?
谢谢
解决方案
根据我的经验:通过设置export OPENBLAS_NUM_THREADS=1
,Maybe 可以在第一种情况下减少 CPU 使用率(没有并行性)。
问题可能是诸如 OpenBLAS 之类的库占用了大量的 CPU 使用率,但它们不会对整体性能造成重大影响。
推荐阅读
- javascript - 如何添加“大约几分钟前、大约几小时前等;” 在 .filter 中用于 angular/ionic v1 项目
- c# - 我可以通过 Blazor 组件更新 DateTime
- javascript - 使用带有 JQuery 的 XML 文件自动完成输入
- apache-spark - 计算比例 Py(Spark) 的置信区间
- architecture - 如何在新增的微服务中实现数据一致性?
- php - IMAP PHP 中不显示新电子邮件
- logstash - logstash中有这么多变量
- blazor - Blazor 服务器强制缓存重新加载
- android - 推送通知即将到来时,Android 应用程序崩溃
- sql-server - SQL UPDATE 和 CASE 语句不起作用