基于Unix的系统。我现在正在尝试在我正在处理的代码中使用尽可能少的开销(它位于资源受限的空间中)。在此特定代码中,我们正在收集一些基本的磁盘使用统计信息。一个建议是用
df
替换对 statfs
的调用,因为 df
是一个 C 实用程序,需要运行自己的子进程,而 statfs
是一个系统调用,可能使用较少的开销(这就是 df
)无论如何打电话)。
我们用 Python 的
df
命令调用
subprocess.check_output()
:
import subprocess
DF_CMD = ["df", "-P", "-k"]
def get_disk_usage() -> str:
try:
output = subprocess.check_output(DF_CMD, text=True)
except subprocess.CalledProcessError as e:
raise RuntimeError(f"Failed to execute {DF_CMD} " + str(e)) from e
return output
我想对我们的挂载点进行硬编码(我们认为我们可以接受),并将上面代码中对
df
的调用替换为对 statfs <mountpoint>
的调用。但是,我不确定使用相同的 Python 函数调用是否真的会减少开销。我计划使用探查器来检查它,但我很好奇是否有人对 Python/Unix 的内部工作原理有足够的了解,知道幕后发生了什么?
需要明确的是:“开销”是指操作系统/机器上的 CPU 和内存使用情况。
但是,我不确定使用相同的 Python 函数调用是否真的会减少开销
生成新进程 -
fork
和 execve
- 通常是极其昂贵的系统调用。它们是 shell 如此缓慢的原因 - shell 中的几乎每个功能都是一个单独的进程,并且 shell 还在许多上下文中生成子 shell。如今,无论如何,计算机的速度都快得多,产生新进程的成本可以忽略不计。现在的计算机上有数千个进程。
是的,将
subprocess
替换为 os.statvfs
将减少开销。除非您正在使用真正真正资源受限的设备,例如,我不知道,64MB 内存,通常不值得花时间,但使代码独立且干净是非常好的并减少可能出现的错误。无论如何,Python 是“非常”消耗内存的,所以运行它的行为已经暗示我,你可能有足够的资源来生成一个子进程。