为什么 numpy.mean 不是多线程的?

2023-12-14

自从我注意到 numpy 它只使用一个核心以来,我一直在寻找轻松地对一些简单分析代码进行多线程处理的方法,尽管事实上它应该是多线程的。

我知道 numpy 是为多个核心配置的,因为我可以看到使用 numpy.dot 的测试使用了我的所有核心,所以我只是将平均值重新实现为点积,并且它运行得更快。是否有某种原因意味着无法自行运行得这么快?我发现较大的数组也有类似的行为,尽管该比率比我的示例中显示的 3 更接近 2。

我读过很多关于类似 numpy 速度问题的帖子,显然它比我想象的要复杂。任何见解都会有所帮助,我更愿意只使用平均值,因为它更具可读性且代码更少,但我可能会切换到基于点的平均值。

In [27]: data = numpy.random.rand(10,10)

In [28]: a = numpy.ones(10)

In [29]: %timeit numpy.dot(data,a)/10.0
100000 loops, best of 3: 4.8 us per loop

In [30]: %timeit numpy.mean(data,axis=1)
100000 loops, best of 3: 14.8 us per loop

In [31]: numpy.dot(data,a)/10.0 - numpy.mean(data,axis=1)
Out[31]: 
array([  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
         0.00000000e+00,   1.11022302e-16,   0.00000000e+00,
         0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
        -1.11022302e-16])

自从我注意到 numpy 它只使用一个核心以来,我一直在寻找轻松地对一些简单分析代码进行多线程处理的方法,尽管事实上它应该是多线程的。

谁说它应该是多线程的?

numpy主要设计为在单核上尽可能快,并且在需要时尽可能可并行化。但你仍然必须并行化它。

特别是,您可以同时对独立的子对象进行操作,并且缓慢的操作会在可能的情况下释放 GIL,尽管“在可能的情况下”可能还不够。还,numpy对象被设计为尽可能容易地在进程之间共享或传递,以方便使用multiprocessing.

有一些专门的方法是自动并行化的,但大多数核心方法不是。尤其,dot尽可能在 BLAS 之上实现,并且 BLAS 在大多数平台上自动并行化,但是mean用纯 C 代码实现。

See 使用 numpy 和 scipy 进行并行编程了解详情。


那么,您如何知道哪些方法是并行的,哪些不是?而且,对于那些不是的,您如何知道哪些可以很好地手动线程化,哪些需要多重处理?

对此没有好的答案。您可以做出有根据的猜测(X 似乎可能是在 ATLAS 之上实现的,并且我的 ATLAS 副本是隐式线程化的),或者您可以阅读源代码。

但通常情况下,最好的办法就是尝试和测试。如果代码使用一个核心 100%,其他核心使用 0%,请添加手动线程。如果它现在使用 100% 的一个核心和 10% 的其他核心,并且运行速度几乎没有提高,请将多线程更改为多处理。 (幸运的是,Python 使这变得非常容易,特别是如果您使用来自concurrent.futures或来自的 Pool 课程multiprocessing。但您仍然经常需要考虑一下,并测试共享与传递(如果您有大型数组)的相对成本。)

另外,正如 kwatford 指出的那样,仅仅因为某些方法似乎不是隐式并行的,并不意味着它在下一个版本的 numpy 或下一个版本的 BLAS 中或在不同的平台上不会并行,或者即使在安装了稍微不同的东西的机器上也是如此。所以,准备好重新测试。并做类似的事情my_mean = numpy.mean然后使用my_mean到处都是,所以你只需将一行更改为my_mean = pool_threaded_mean.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 numpy.mean 不是多线程的? 的相关文章

  • 使用 Python 和 lmfit 拟合复杂模型?

    我想适合椭偏仪 http en wikipedia org wiki Ellipsometry使用 LMFit 将数据转换为复杂模型 两个测量参数 psi and delta 是复杂函数中的变量rho 我可以尝试将问题分离为实部和虚部共享参
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • Python3将模块从文件夹导入到另一个文件夹

    我的结构字典是 mainFolder folder1 init py file1 py file2 py folder2 init py file3 py file4 py setup py init py 我需要将 file4 py 从f
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 如何知道python运行脚本的路径?

    sys arg 0 给我 python 脚本 例如 python hello py 返回 sys arg 0 的 hello py 但我需要知道 hello py 位于完整路径中的位置 我怎样才能用Python做到这一点 os path a
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • Python 在哪些系统上不使用 IEEE-754 双精度浮点数

    Python 对 IEEE 754 浮点运算进行了各种引用 但不保证1 https docs python org 3 tutorial floatingpoint html 2 https pythondev readthedocs io
  • Python在没有pandas的情况下解码excel表

    我正在尝试在 python 中读取 excel 文件而不使用pandas or xlrd 我一直在尝试将结果转换为bytes to utf 8没有任何成功 xls 文件中的数据 colA colB colC spc 1D0 20190705
  • Flymake的临时文件可以在系统临时目录下创建吗?

    我目前正在使用以下代码在 emacs 中连接 Flymake 和 Pyflakes defun flymake create temp in system tempdir filename prefix make temp file or
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM

随机推荐

  • MapView Pin 注释的问题 - 当地图缩放/平移/区域更改时 Pin 会失去颜色

    我有一个显示现金点位置的地图视图 注释将被删除 并且可以单击标注以转到包含有关该位置的更多详细信息的页面 提款机分为免费和付费两类 免费提款机的针脚为绿色 另一种为红色 当别针掉落时 它们的颜色是正确的 一切正常 直到我缩放到用户位置或地图
  • 如何删除子列表

    如何从列表中删除所有出现的子列表 例如 List 1 2 3 4 5 6 7 4 8 9 10 5 removeSubList 4 5 应该删除所有出现的 4 5 按此顺序 因此它返回 List 1 2 3 6 7 4 8 9 10 5 使
  • 无法跨选项卡查看本地存储事件

    我正在尝试创建一个简单的概念验证 涉及在发生更改时使用 localStorage 在我的应用程序中触发选项卡 根据我看过的其他文章 我知道这是可能的 我明白the spec声明该事件将在每个页面上触发except我现在使用的那个 这实际上就
  • 视图始终执行 HTTP GET 而不是提交时发布

    我一直无法弄清楚为什么会发生这种情况 在我所在的每个简单视图上 当我单击提交按钮时 请求总是被路由回控制器并触发视图的 HTTPGET 方法 我什至尝试使用 POST 对表单标签进行硬编码 但它仍然发生 这似乎是某种路由问题 但我不确定下一
  • 如何从数据框中选择不匹配的行?

    我试图识别数据框中不匹配的值 但不知道如何执行此操作 make data frame a lt data frame x c 1 2 3 4 b lt data frame y c 1 2 3 4 5 6 select only value
  • Javascript 硬币兑换/找零算法

    所以我一直在尝试用 Javascript jQuery 创建一个程序 将一定数量的钱分成最小数量的美元钞票 到目前为止 该计划仅适用于一项法案 我不太确定如何实施其余法案 需要在正确的方向上推动 var bills 5 10 20 50 1
  • 如何强制一个类恰好具有给定属性之一

    我有一个 Person 类和一组数据属性 First Name Surname Gender DoB Country of Birth 数据属性的 Domains 设置为 Person 我想在我的本体论中建立一条规则 规定每个人must恰好
  • jquery 淡入回调不等待

    我试图让一个 div 淡出 然后让第二个 div 淡入其位置 但是第二个 div 淡出的回调似乎不会等待第一个 div 完成淡出 事实上它们都同时淡出时间提供交叉淡入淡出效果而不是淡出然后再淡出 继承人的代码 document ready
  • python脚本输出末尾的百分号[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 为什么 python 脚本的输出末尾有一个百分号 echo 测试测试 修剪测试一下 usr bin env python import sys if name main for lin
  • Django:重定向到上一页并保持滚动位置

    我见过this问题是您可以使用以下命令重定向到上一页 return HttpResponseRedirect request META get HTTP REFERER 但有没有办法也保持滚动位置呢 上面的内容重新加载页面 经过一番来回 这
  • MySql 查询从表中找出前 50% 的记录

    我正在尝试从 MySQL 表用户获取前 50 的记录 我知道我们可以使用 limit 或 top 来查找它们 但记录总数不固定 因此对 limit 或 top 中的实际数量进行硬编码并不能给出前 50 的记录 我怎样才能实现这个目标 如果您
  • 根据父宽度定位绝对顶部属性

    有以下 HTML div class child of body This is a text div 和以下 CSS child of body position absolute top 10 我可以设置top所选元素的值 我看到10
  • 使用值范围作为键的字典对象

    我需要一本专门的词典 我的用例是这样的 用户想要指定值的范围 该范围也可以是单个点 并将值分配给特定范围 然后我们希望使用单个值作为键来执行查找 如果该单个值出现在某个范围内 那么我们将返回与该范围关联的值 例如 represents th
  • 数组中最常见的值

    我将如何找到数组中三个最常见的元素 我正在处理长度为 10 000 的数组 其元素 0 100 之间的随机整数 我正在考虑使用两个数组 其中一个长度为 100 并且通过使用 if 语句来递增 但是 我想知道是否有一种方法可以仅使用一个 fo
  • 在 XML 或 java 文件中编写相同的代码(用于布局)是否存在性能差异?

    我知道 XML 和 java 文件中可以执行的操作和不能执行的操作之间存在差异 但到目前为止 我了解到 java 文件可以执行 XML 文件可以执行的所有操作 至少在我正在阅读的书中是这样写的 请参阅下面的引用 因此 我的问题是 用 jav
  • 安全地存储 api 凭证

    我如何安全地存储 API 凭据 如身份验证密钥 谷歌地图 API 密钥 目前我已将该凭据存储在 strings xml KeygenratorSpec 要求最低 API 级别为 23 有什么方法可以安全地存储任何帮助都会更有帮助我陷入困境2
  • BigQuery 使用 PHP 流式传输“insertAll”性能

    我们使用以下方法将大量数据从服务器端流式传输到 BigQuery 中 google api php 客户端图书馆 除了性能之外 流媒体工作正常 我们的负载测试显示 将一行流式传输到 BigQuery 的平均时间为 1000 毫秒 1 秒 我
  • 无法向某些控件发送 WM_INPUTLANGCHANGEREQUEST

    我正在研究 又一个 键盘布局切换器并在 Skype 窗口 win7 x64 上的版本 6 22 中遇到了奇怪的问题 任意组合GetForegroundWindow GetFocus GetParentWindow 无法成功更改布局仅在消息输
  • 将 Double 值格式化为小数点后两位的最佳方法[重复]

    这个问题在这里已经有答案了 我在应用程序中处理大量双精度值 有没有简单的方法来处理 Java 中十进制值的格式 还有比这更好的方法吗 DecimalFormat df new DecimalFormat 我想做的基本上是格式化双值 例如 2
  • 为什么 numpy.mean 不是多线程的?

    自从我注意到 numpy 它只使用一个核心以来 我一直在寻找轻松地对一些简单分析代码进行多线程处理的方法 尽管事实上它应该是多线程的 我知道 numpy 是为多个核心配置的 因为我可以看到使用 numpy dot 的测试使用了我的所有核心