python - 为什么 subprocess getoutput 会增加非常量开销?
问题描述
在 macOS 上的 Python 3.6.7 中,我将这个测试运行到 time subprocess.getoutput
:
In [11]: %timeit for _ in range(100000): x = 1
1.97 ms ± 48.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [12]: %timeit subprocess.getoutput('python -c "for _ in range(100000): x=1"')
42.1 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [13]: %timeit for _ in range(1000000): x = 1
19.3 ms ± 128 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [14]: %timeit subprocess.getoutput('python -c "for _ in range(1000000): x=1"')
92.5 ms ± 3.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [15]: %timeit for _ in range(10000000): x = 1
189 ms ± 4.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [16]: %timeit subprocess.getoutput('python -c "for _ in range(10000000): x=1"')
551 ms ± 11.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [17]: %timeit for _ in range(100000000): x = 1
1.94 s ± 51.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [18]: %timeit subprocess.getoutput('python -c "for _ in range(100000000): x=1"')
5.25 s ± 26.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我惊讶地发现子进程的时间开销似乎随着内部调用所花费的时间而增加。我本来预计开销大致恒定。为什么会这样?谢谢!
解决方案
正如@user2357112 在评论中支持 Monica 所建议的那样,如果我time
在命令行中使用而不是 ,差异似乎消失了%timeit
,这表明差异在于对函数局部变量的访问。
$ time python -c "for _ in range(10000000): x=1"
real 0m0.592s
user 0m0.551s
sys 0m0.034s
$ time python -c "import subprocess; subprocess.getoutput('python -c \"for _ in range(10000000): x=1\"')"
real 0m0.644s
user 0m0.590s
sys 0m0.046s
$ time python -c "for _ in range(100000000): x=1"
real 0m5.104s
user 0m5.053s
sys 0m0.039s
$ time python -c "import subprocess; subprocess.getoutput('python -c \"for _ in range(100000000): x=1\"')"
real 0m5.161s
user 0m5.098s
sys 0m0.051s
推荐阅读
- r - 我想用标记的椭圆和组的部分向量绘制 FactoMineR MFA
- multithreading - Python线程一次不运行2个进程
- react-native - 如何在 react-native-signature-capture 中获取保存的签名图像
- shell - Shell:如果..elif 条件无法按要求创建文件
- image - 如何将类型“UnityEngine.Texture2D”转换为“UnityEngine.Sprite”?
- javascript - JS:传递的 JSON-Array 丢失引号
- javascript - JS:在for循环中调用异步函数不引用相同的迭代变量
- android - 使用喷气背包导航在操作栏中显示返回箭头
- linux - 端口扫描仪显示模块错误,这与什么有关?
- javascript - 如何将对象键分配给同一属性并创建具有名称和值对的对象数组-Javascript