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

时间:2015-12-28 21:20:40

标签: python benchmarking cprofile

我使用cprofile来配置python程序。最耗时的部分是posix.waitpid。我该怎么做才能提高代码性能?请参阅下面的屏幕截图,了解我的cprofile结果的一行

enter image description here

1 个答案:

答案 0 :(得分:5)

subprocess.call花费时间在posix.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模块很可能是比{{1}更好的选项}。