繁体   English   中英

如果以不同的方式调用相同的 python 命令需要不同的时间

[英]Same python commands take different time if called in different ways

我有一些数据(字节)表示来自后台运行的可执行文件的 pyzmq 套接字的 png 图像。 我使用以下命令将它们转换为 numpy 数组

decoded = np.asarray(im.open(io.BytesIO(data)))

当我从命令行执行此操作时,这行代码的运行时间不到一毫秒(也通过 python 的分析器进行了验证)。 到目前为止,一切都很好。

现在我需要从我名为Heron的应用程序运行同一行代码。 这解释起来有点棘手,但实际上 Heron 是一个图形框架,它生成多个进程,每个进程通过 0MQ sockets 连接到其他进程以进行数据传输。 用户将每个进程的代码放在一起(遵循 Heron 的 API),Heron 将为它创建一个图形节点,并负责启动和关闭一个子进程以运行该代码,以及在该子进程和所有进程之间接收和发送消息其他苍鹭已经产卵。 出于所有意图和目的,我上面提到的代码行只是在 Heron 启动的自己的进程中运行(而不是从命令行调用)。 据我所知,其他一切都是相同的。

当我从 Heron 子进程内部运行此行时,运行大约需要 90 毫秒(再次由 python 分析器验证)。 相同的命令(如 PIL 的 PngImagePlugin.py:198(call))现在将花费 16 毫秒,而不是之前情况下的 1 毫秒)。

我还尝试从运行同一行的命令行创建一个子进程,但毫无用处,它的运行速度与直接从命令行运行一样快(不到 1 毫秒)。 因此,问题似乎与子进程中运行的代码没有直接关系,而是它在 Heron 专门创建的子进程中运行的方式。

Heron 的主要进程(产生所有其他进程)是一个dearpygui进程(因此它显示一个 gui)。

我知道这个问题非常模糊,特别是因为我是写 Heron 的人(所以我现在应该更好地了解它的行为),但对于我的生活,我不明白为什么在基于 gui 的进程启动的子进程中运行的代码(苍鹭)的行为会有所不同。

Heron 启动子流程如下:

kwargs = {'start_new_session': True} if os.name == 'posix' else\ {'creationflags':subprocess.CREATE_NEW_PROCESS_GROUP} pid = subprocess.Popen(new_arguments_list, **kwargs).pid

以上所有都发生在 Windows 10 和 3.9 python 下。我还没有尝试过 Linux。

我发布这篇文章是希望你们中的一些人可能在不同情况下遇到过 python 代码中执行速度不同的相同问题,并且可能会给我一些关于在哪里寻找解决方案的指示。

期望和我做了什么:

我期望同一行代码的执行速度相同。

我尝试在它自己的子进程中运行代码,但这并没有产生差异,所以它一定是 Heron 正在做的事情更独特的。

我还禁用了垃圾收集器,但没有任何区别。

在 @Jérôme 的最初评论之后,我试图将运行有问题的代码行的进程固定到单个 cpu 核心(我的机器中有 8 个)。

我用下面的代码做到了这一点:

affinity = [int(affinity)]
proc = psutil.Process()  # get self pid
aff_before = proc.cpu_affinity()
proc.cpu_affinity(affinity)
aff_after = proc.cpu_affinity()
print('Setting CPU affinity of Com process with PID: {} (and its Worker process) from {} to {}'.format(proc.pid, aff_before, aff_after))

这立即解决了问题,现在执行代码行所花费的时间与从命令行调用它们时所花费的时间相同。

Heron 生成大量进程,2 * 其计算图所具有的节点数,通常这可以是 3 到 10 个节点之间的任何值,因此在任何时间点都有 6 到 20 个进程。

我不知道为什么这会导致某些代码行减慢两个数量级。 现在会很有趣(但又是一个问题)。 无论如何,问题都解决了(现在我已经向 Heron 添加了将进程固定到核心的能力:))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM