shutil.move()比os.remove() + os.rename()慢
我注意到,当我想把一个文件'a'移动到另一个地方'b'并覆盖它时,先用os.remove('b')删除'b',再用os.rename('a','b')的速度比直接用shutil.move('a','b')快很多。
我看过这个文档,里面提到:
如果目标文件在当前的文件系统上,就会使用os.rename()。否则,源文件会被复制到目标位置,然后源文件会被删除。如果是符号链接,会在目标位置创建一个新的符号链接,指向源文件,然后删除源文件。
但是为什么不直接用os.remove()呢?
举个例子(这是我第一次用timeit,如果有错误请见谅):
import os,timeit
os.chdir('c:\python')
def myMove(a,b):
os.remove(b)
os.rename(a,b)
with open('src1', 'wb') as fout:
fout.write(os.urandom(350000000))
with open('src2', 'wb') as fout:
fout.write(os.urandom(350000000))
with open('dest1', 'wb') as fout:
fout.write(os.urandom(350000000))
with open('dest2', 'wb') as fout:
fout.write(os.urandom(350000000))
print('shutil.move(): %.3f' %timeit.timeit('shutil.move(os.path.join("c:\python","src1"),os.path.join("c:\python","dest1"))','import shutil,os.path', number = 1))
print('os.rename(): %.3f' %timeit.timeit('myMove("src2","dest2")','from __main__ import myMove', number = 1))
打印结果:
shutil.move(): 0.81
os.rename(): 0.052
1 个回答
7
如果 os.rename(src, dst)
中的 src
和 dst
在不同的文件系统上,不能保证这个操作一定能成功。而且在Windows系统上,如果 dst
已经存在,这个操作也会失败。
正如文档中所说的那样。