shutil.move()比os.remove() + os.rename()慢

2 投票
1 回答
3331 浏览
提问于 2025-04-18 03:50

我注意到,当我想把一个文件'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) 中的 srcdst 在不同的文件系统上,不能保证这个操作一定能成功。而且在Windows系统上,如果 dst 已经存在,这个操作也会失败。

正如文档中所说的那样。

撰写回答