Python 多处理模块的开销

2023-12-02

我正在使用multiprocessingPython 中的模块,并期望启动进程、创建队列以及向队列中放入值或从队列中获取值会产生一些开销。但是,如果子流程有足够的工作要做,我预计开销最终会被消除。运行一个简单的示例(如下所述),我生成的进程的运行时间大约是从父进程启动的同一进程的 10 倍,即使对于非常大的作业也是如此。

在下面的代码中,我计算一系列越来越大的数组的平均值。我比较打电话numpy.mean从父进程到从单个生成的进程调用相同的均值函数,以及在生成的进程中不执行任何操作(以了解开销成本)。

最初,结果正如我所预期的那样。总运行时间要快得多mean从父进程调用而不是从派生进程调用。对于小型作业,生成进程的运行时间主要由开销决定。

然而,令人惊讶的是,对于较大的作业,生成的进程的运行时间始终超过从父进程调用的成本约 10 倍。

谁能对此提供解释?这是由于子进程的内存限制吗?我测试的最大阵列有 125MB、500MB 和 2GB。

这是代码:

%matplotlib 
import numpy, multiprocessing, pandas

def do_nothing(x,q):
    q.put(x[-1])

def my_mean(x,q):
    q.put(numpy.mean(x))

def test_mp(f,x):
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=f,args=(x,q))
    p.start()
    p.join()
    s = q.get()
    return s

ndata = 2**numpy.arange(10,29,2)
tr1,tr2,tr3 = [[],[],[]]
for n in ndata:
    x = numpy.random.rand(n)
    tresults = %timeit -n 1 -r 5 -o -q test_mp(do_nothing,x)
    tr1.append(tresults)

    tresults = %timeit -n 1 -r 5 -o -q test_mp(my_mean,x)
    tr2.append(tresults)

    tresults = %timeit -n 1 -r 5 -o -q numpy.mean(x)
    tr3.append(tresults)

print("All done")

t1,t2,t3 = map(lambda tr : pandas.Series([1000*t.best for t in tr]),[tr1,tr2,tr3])
df = pandas.DataFrame({'n' : ndata, 't1 (do nothing)' : t1, 
                       't2 (my_mean)' : t2, 
                       't3 (mean)'    : t3})
display(df)
df.plot(x='n',style='.-',markersize=10,logx=True,logy=True)

这是结果。所有计时结果均以毫秒为单位。

enter image description here

enter image description here


以下是对正在发生的事情的一些观察:

  • 使用-c标记在%timeit仅显示父进程的 CPU 时间,在本例中,my_mean and do_nothing显示基本相同的平坦时间。因此,父进程在这两种情况下使用相同的 CPU 时间。

  • 如果没有-c标志,正在考虑酸洗过程中的时间,至少在调用中my_mean。为何不计入do_nothing至今仍是一个谜。 Python 解释器是否足够聪明来识别这一点do_nothing真的什么都不做吗?

  • 还有什么有点神秘:谁在腌制?父进程?如果是这样,则它不会使用任何 CPU 时间。所以它一定是衍生进程。

  • 使用线程模块(带有queue.Queue(), and threading.Thread(),结果更符合预期,即对于足够大的问题,运行时间主要取决于计算平均值所需的时间以及调用numpy.mean()并且在生成的进程中进行相同的调用基本上需要相同的时间。

以下是使用 threading 模块出现相同问题的次数:

enter image description here

enter image description here

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

Python 多处理模块的开销 的相关文章

  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 如何以编程方式在 C/C++ 中引发核心转储

    我想在我的 C 应用程序中的特定位置强制进行核心转储 我知道我可以通过执行以下操作来做到这一点 int crash NULL crash 1 但我想知道是否有更干净的方法 顺便说一句 我正在使用Linux 发出 6 号信号 SIGABRT在
  • 将 NULL 数组填充到自定义聚合函数的最大长度

    从问题的回答来看如何对 varchar 使用 array agg 我们可以创建一个自定义聚合函数来聚合 Postgres 中的 n 维数组 如下所示 CREATE AGGREGATE array agg mult anyarray SFUN
  • TransactionScope 内的 Membership.GetUser() 抛出 TransactionPromotionException

    下面的代码抛出一个TransactionAbortedException带有消息 交易已中止 和内部TransactionPromotionException消息 尝试促进交易失败 using TransactionScope transa
  • C# 解析日期和时间

    我在应用程序中有一些代码 类似于 DateTime activityDate DateTime Parse tempDate tempTime Where tempDate是一个字符串 其值如 2009 12 01 即 yyyy mm dd
  • 在后台运行脚本?

    简单的问题 有没有办法在后台运行脚本而不运行终端 更多细节和背景 我有一个应用程序 它读取应用程序的 log 文件并从中提取信息 然后从日志中的信息提供信息和统计信息 应用程序的更新改变了 log 文件的写入方式 删除信息并以我无法预测的方
  • NetworkX:分层绘制图形

    我有一个按级别划分的图表 即 f e ids 0 100 are lowest level ids 101 500 are level 2 ids 501 1500 are level 3 and so on 有没有某种方法可以强制图形在分
  • 如何阻止过度访问我的网站的机器人?

    这个机器人不尊重nofollow noindex在robots txt中 我在 robots txt 中有这个 User agent Msnbot Disallow User Agent Msnbot 2 0b Disallow 到目前为止
  • Pyephem 计算当前太阳时

    我正在尝试根据 UTC 小时和经度计算当地太阳时 我已经浏览过ephem包 但无法确定执行此操作的直接方法 关于这个问题的类似问题要么引起固定位置 日出 月亮 日落 的计算 例如使用 PyEphem 计算黎明和日落时间 或接收简化方法的建议
  • pip install pydot 引发语法错误

    我从命令行运行 pip 尝试安装 pydot 因为 Django 的 django extensions 需要它来生成 UML 类图 当我运行命令时pip install pydot 它给了我这个错误 Collecting pydot Us
  • 用鼠标移动图片框

    我正在开发一个适用于 Windows Mobile Compact Framework 2 0 的应用程序 它有一个带有 PictureBox 的 WinForms 我想移动PictureBox的图像 但我不知道该怎么做 所以我选择移动Pi
  • Feed RDLC(本地)报告来自列表(实体框架)的报告

    我给自己找了一个BiningList学生 实体框架创建的类 我只想喂饱我的RDLC从中报告而不是使用DataSet或存储过程 该类包含多个属性 例如 string Name string FamilyName string Mid Date
  • Apache Rewrite:基于HTTP主机的图像目录

    我的软件支持多个域名 所有域名都指向服务器上的同一目录 当然每个域名都有不同的数据库 那么这些域 www example1 com www example2 com www example3 com 都指向 public html 在图像目
  • 如何检查 Reddit 帖子是否仅包含图像而没有其他内容?

    背景 我目前正在使用prawPython 3 7 的库 我的机器人需要做的一件事是检查某些 Reddit 子版块上的最新帖子 看看它们是否包含只是一个图像 没有其他任何东西 鉴于 Reddit 上有不同类型的帖子 仅上传图像的帖子和带有图像
  • 简单注入器身份 UserManager 注册错误

    我正在遵循洋葱架构并使用身份框架 在我的核心项目中 我有 public interface IUserRepository IDisposable Repository methods 在我的 Architecture Repository
  • 访问多维数组中任意深度的键

    如果我有一个包含以下内容的数组 key1 key2 key3 有什么方法可以将其映射到数组 array key1 key2 key3 不使用循环或 eval 数组示例 var key1 gt subkey1 gt finalkey gt v
  • 循环结构的迭代器

    以下代码显示了我目前拥有的内容 它是一个适配器 循环数据结构 main 函数展示了它是如何使用的 这 一切都很好而且很快 但我真的很想让迭代器结束 定义的结构circ 到目前为止涉及的所有方法 某种计数方案 如果使用循环器则计算范围 构建一
  • 使用 Visual Studio sdk 取消修饰函数名称

    要取消修饰 Visual Studio 生成的损坏的 C 名称 您可以使用undname exe 但是 如果您想避免每次需要未装饰时创建完整进程的开销 该怎么办 Visual Studio SDK 中是否有任何等效功能 VS2005 应该支
  • 哪些 Grails 项目文件不应该添加到版本控制中? (Grails 1.3.x)

    这个问题之前已经被问过 但不久前 对 Grails gitignore 的建议 这是针对 grails 1 0 x 的回答 Grails 1 3 x 项目中的哪些文件不应包含在版本控制中 See http grails org Checki
  • 静态类成员上未解析的外部符号

    非常简单地说 我有一个主要由静态公共成员组成的类 因此我可以将类似的函数组合在一起 但仍然需要从其他类 函数调用它们 无论如何 我在类公共作用域中定义了两个静态 unsigned char 变量 当我尝试在同一个类的构造函数中修改这些值时
  • Python 多处理模块的开销

    我正在使用multiprocessingPython 中的模块 并期望启动进程 创建队列以及向队列中放入值或从队列中获取值会产生一些开销 但是 如果子流程有足够的工作要做 我预计开销最终会被消除 运行一个简单的示例 如下所述 我生成的进程的