python - subprocess.call() 和 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

https://stackoverflow.com/questions/69117088/

相关文章:

r - 如何根据列中的两个值过滤行?

c - 有没有办法从未知字节设置/清除位,同时保持所有其他位不变?

c# - Parallel.Foreach 和每个产生不同的结果 : Why is my code

Go - 如何子类型化包装错误类?

c# - 如何在 C# 中使用预处理器指令仅在 Windows 10 上执行一些代码?

c++ - 在 constexpr 分支中使用枚举类值

flutter - 如何在 flutter 中的行之间写 OR

amazon-web-services - 带有自定义 SAML 应用程序的 AWS SSO 'no

python - AES CTR解密: Cryptography and Cryptodome gi

c++ - 在 "Effective Modern C++"示例中在索引运算符之前使用 std::f