subprocess.call() 和 os.system() 之间的速度差异

Bil*_*Cao 3 python performance operating-system subprocess

subprocess.call()和命令的执行速度有区别吗os.system()?假设命令本身完全相同。

我知道有很多帖子谈论子流程的好处以及为什么os.system()应该放弃......但没有人提到任何关于它们的速度。据我了解, subprocess 远不及 的包装器os.system(),这意味着可能存在速度差异。

更喜欢用实验数据而不是理论材料来回答,因为我实际上需要它来评估具有数百个此类调用的脚本的性能。

Jér*_*ard 9

os.systemsubprocess.call比Windows 上贵得多。实际上,os.system启动一个批处理解释器来解析命令,然后通常找到要在路径中运行的可执行文件,然后启动一个运行目标可执行文件的新进程。同时,subprocess.call主要启动目标可执行文件。运行新进程是最昂贵的操作之一,因此运行两个进程会使操作速度变慢。

Windows 上的一个简单基准测试证明了这一点(调用ls.exe空目录):

os.system:       62.3 ms/call
subprocess.call: 34.8 ms/call
Run Code Online (Sandbox Code Playgroud)

在 Linux/Mac/WSL 上,启动新进程的成本要小得多。因此,我们应该预期差距会更小,事实也是如此。然而,结果有点令人惊讶,因为速度subprocess.call有点慢。这是 WSL2 上的结果:

os.system:       3.0 ms/call
subprocess.call: 3.8 ms/call
Run Code Online (Sandbox Code Playgroud)

  • 在本机 Ubuntu 机器上,“os.system”为 3.2 毫秒,“subprocess.call(shell=True)”为 4.5 毫秒,没有“shell=True”为 1.1 毫秒。在所有情况下,使用“/bin/true”都可以将时间减少大约四分之一。 (2认同)