subprocess.call() 和 os.system() 之间的速度差异
Speed difference betwen subprocess.call() and os.system()
subprocess.call()
和os.system()
命令的执行速度有区别吗?假设命令本身完全相同。
我知道有很多帖子都在谈论子流程的好处以及为什么 os.system()
应该被抛弃……但是没有人提到它们的速度。据我了解,子进程远不是 os.system()
的包装器,这意味着可能存在速度差异。
更喜欢实验数据而不是理论的答案,因为我实际上需要它来评估具有数百个此类调用的脚本的性能。
os.system
在 Windows 上比 subprocess.call
贵得多。实际上,os.system
会启动一个批处理解释器来解析命令,然后通常会在路径中找到 运行 的可执行文件,然后启动一个新进程 运行 连接目标可执行文件。同时,subprocess.call
主要启动目标可执行文件。 运行 新进程是最昂贵的操作之一,因此 运行 使用两个进程会使操作变慢。
Windows 上的一个简单基准测试证明了这一点(在空目录上调用 ls.exe
):
os.system: 62.3 ms/call
subprocess.call: 34.8 ms/call
在 Linux/Mac/WSL,开始新进程的成本要小得多。因此,我们应该预期差距会更小,情况确实如此。然而,结果有点令人惊讶,因为 subprocess.call
有点慢。这是 WSL2 上的结果:
os.system: 3.0 ms/call
subprocess.call: 3.8 ms/call
subprocess.call()
和os.system()
命令的执行速度有区别吗?假设命令本身完全相同。
我知道有很多帖子都在谈论子流程的好处以及为什么 os.system()
应该被抛弃……但是没有人提到它们的速度。据我了解,子进程远不是 os.system()
的包装器,这意味着可能存在速度差异。
更喜欢实验数据而不是理论的答案,因为我实际上需要它来评估具有数百个此类调用的脚本的性能。
os.system
在 Windows 上比 subprocess.call
贵得多。实际上,os.system
会启动一个批处理解释器来解析命令,然后通常会在路径中找到 运行 的可执行文件,然后启动一个新进程 运行 连接目标可执行文件。同时,subprocess.call
主要启动目标可执行文件。 运行 新进程是最昂贵的操作之一,因此 运行 使用两个进程会使操作变慢。
Windows 上的一个简单基准测试证明了这一点(在空目录上调用 ls.exe
):
os.system: 62.3 ms/call
subprocess.call: 34.8 ms/call
在 Linux/Mac/WSL,开始新进程的成本要小得多。因此,我们应该预期差距会更小,情况确实如此。然而,结果有点令人惊讶,因为 subprocess.call
有点慢。这是 WSL2 上的结果:
os.system: 3.0 ms/call
subprocess.call: 3.8 ms/call