发现绩效问题的最好方法是自己衡量。Python实现各不相同。同样,如果您想了解它们是如何实现的,那么请阅读源代码。
所有这些机制都可能在类UNIX系统上调用相同的底层C库接口getcwd(3)。只是有些人用外部程序来达到目的。
os.system("pwd")运行一个shell(第一个进程)来运行外部程序pwd(第二个进程)。因此性能会很差,而且不可移植,因为pwd不是在所有支持Python的平台上都实现的。输出到stdout,它不会被捕获以在程序中使用。
您省略了函数popen:wd = os.popen('pwd').readline()
这被认为是过时的,os.system()也是,两者都被subprocess取代。popen实现可能使用C运行时库函数popen,该函数还调用shell来执行命令,因此性能可能很差。
subprocess模块是用来替换这些旧接口的,因此是重复的。一个优点是shell的使用是可选的,在这种情况下您不需要它。但你的代码不完整:proc = subprocess.Popen(['pwd'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
wd, err = proc.communicate()
if err:
print >> sys.stderr, err
else:
print wd,
这将更加有效,因为没有shell进程。但实际上你应该在自己的系统上对它进行基准测试。
到目前为止,所有的接口都是通用-它们用于运行各种命令和外部程序。它们经常被滥用和不当使用,这反映了程序员缺乏理解(或懒惰)。
我们只剩下os.getcwd()。它可能是作为对C库接口的直接调用来实现的,但可能会绕过它来调用内核。检查实现的源代码。没有子进程,所以速度更快。
您关于复制的观点也可以用于许多其他接口,os.remove(),os.mkdir(),os.stat(),等等。关键是这些程序速度快,可移植,不运行其他程序。
与使用shell相比,使用Python这样的语言有这些直接接口是一个主要优势。Bash没有用于获取当前目录、获取文件大小、删除文件等的内置命令。它依赖于外部程序——python没有。