如果在代码中最耗时的部分是posix.waitpid,如何提高代码性能?

12

我使用cProfile来对Python程序进行性能分析,其中耗时最长的部分是posix.waitpid。我该怎么做来提高代码性能?请查看下面cProfile结果的截图:

图片描述


避免调用waitpid?;) 说真的,这个调用是从哪里来的?你能展示一下导致这个问题的代码吗? - zvone
不,我没有调用waitpid。代码非常大。 - zell
1
当然,你并没有直接调用waitpid,而是调用了一些其他内置函数,这些函数又间接地调用了它。我猜测subprocess.call可能会这样做。使用正确的标志,分析器应该能够帮助你找到被调用的内容。你也可以尝试RunSnakeRun——这是一个用于查看分析数据的图形化工具。 - zvone
你是完全正确的。我确实调用了subprocess call来运行另外两个Python脚本。你认为通过'import'这些Python脚本,并调用它们的主函数比使用subprocess.call更快吗?非常感谢。 - zell
1个回答

8

subprocess.callposix.waitpid 上花费时间

当你使用 subprocess.call(other_process) 时,它会启动其他进程并等待其完成。如果其他进程执行了大量工作,那么这将需要很长时间。

这就是你的分析器所显示的:大部分时间都在等待其他进程完成。

很可能,其他进程实际上有充分的理由需要那么长时间,但分析器无法告诉你任何关于此的信息,因为它正在分析 这个进程,而不是 其他进程

使用import代替call

你在评论中写道,你可以导入其他脚本并运行其主函数。这肯定会消除创建新进程的开销,但很可能大部分时间实际上都在其他进程的主函数中。

好吧,至少使用import,所有内容都将在同一个进程中运行,分析器将能够提供更有用的信息。

另一方面,你想要一个子进程?

不清楚你首先为什么创建了一个子进程,所以我猜测你想要并行执行其代码。

好吧,你可以启动一个子进程而不等待它完成:

不要使用:

subprocess.call(other_process)

请执行以下操作:

process = subprocess.Popen(other_process)

# the code which follows is executed in parallel with the other process

现在子进程已经启动,您可以使用process变量来查看它何时完成。
其他选项:threadingmultiprocessing 如果您想并行运行一些可以导入的代码,则threadingmultiprocessing模块可能比subprocess更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接