Python的tarfile比Linux命令慢

5

我尝试了不同的方法来压缩文件夹。我的理解是,Python内置模块总是比subprocess.call("Linux命令")更快。但是我刚刚做了一些演示。tarfile模块比subprocess.call("tar")慢。有人能给我解释一下吗?

    #!/usr/bin/python

import os
import time
import tarfile
import subprocess

tStart1 = time.time()

TestFolder = ["Jack", "Robin"]
for folder in TestFolder:
    name = "/mnt/ShareDrive/Share/ExistingUsers/"+folder
    path = "/mnt/TEST2/"
    tar = tarfile.open(path+folder+".tar.gz", "w:gz")
    tar.add(name)
    tar.close()
tEnd1 = time.time()

time.sleep(2)

tStart2 = time.time()
for folder in TestFolder:
    path = "/mnt/TEST1/"
    subprocess.call(["tar", "zcvf", path+folder+".tar.gz", "-P", "/mnt/ShareDrive/Share/ExistingUsers/"+folder])
tEnd2 = time.time()

print "The module cost %f sec" % (tEnd1 - tStart1)
print "The subprocess cost %f sec" % (tEnd2 - tStart2)

tarfile模块花费63秒。子进程只花费32秒。

两个文件夹的总大小为433 MB。


1
我的理解是,Python内置模块总是比subprocess.call("Linux命令")更快。但这种假设没有任何依据。 - Paulo Almeida
@PauloAlmeida 谢谢您纠正我。 - ITnewbie
2个回答

9

tar 是用 C 语言编写的。而 tarfile 模块是 tar 文件处理的纯 Python 实现。这个模块不可能比命令更快。


谢谢解释。看起来我对Python模块有很大的误解。非常感谢! - ITnewbie
实际上,tarfile 模块的 gzip 压缩是用 C 实现的,因此它的性能和 tar czf 一样好。它只是有一个不同的默认压缩级别。 - undefined

2
在我的实验中,使用 w:gztarfiletar cfz 更慢,但也提供更好的压缩。因此我认为这是因为 tarfile 仅具有更高的默认压缩级别所致。

谢谢这个 - 我认为压缩级别可能是一个重要因素。根据 tarfile.open 文档 (https://docs.python.org/3/library/tarfile.html#tarfile.open) ,对于 w:gz,默认级别是 9 (最大值),比 tar czf 的默认级别高得多 (也更慢)。我在 https://stackoverflow.com/a/45308288/579925 找到了一个答案,它帮助我修改了 tarfile.open 的压缩级别。 - Peter Briggs
谢谢,我已经根据您的问题澄清了我的回答。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接