我使用cprofile来分析python程序。最耗时的部分原来是posix.waitpid。我该怎么做才能提高代码性能?请参阅以下屏幕截图,了解我的cprofile结果的一行
subprocess.call
花时间在 posix.waitpid
当您使用时subprocess.call(other_process)
,它将启动另一个过程并等待其完成。如果其他过程做了很多工作,那将花费很多时间。
那就是您的探查器所显示的:大多数时候,您正在等待其他过程完成。
实际上,另一个进程确实有充分的理由要花那么多时间,但是Profiler无法告诉您任何有关该进程的信息,因为它是在对这个进程进行概要分析,而不是对另一个进程进行概要分析。
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
变量查看它何时完成。
threading
,multiprocessing
如果您想并行运行一些可以导入的代码,那么threading
和multiprocessing
模块相比,可能是更好的选择subprocess
。