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

ore*_*isf 1 python python-3.x

因此,我注意到,当我想移动文件'a'并覆盖目标位置'b'时,os.remove('b')然后os.rename('a','b')的运行速度比shutil快得多.move('a','b')。

我读过

如果目标位于当前文件系统上,则使用os.rename()。否则,将src复制(使用shutil.copy2())到dst,然后将其删除。对于符号链接,将在dst中或作为dst创建指向src目标的新符号链接,并删除src。

但是为什么它还不使用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))
Run Code Online (Sandbox Code Playgroud)

印刷品:

shutil.move():0.81

os.rename():0.052

m.w*_*ski 5

os.rename(src, dst)如果srcdst在不同的文件系统上,则不能保证能正常工作。如果dst存在,它将无法在Windows上运行。

正如文档所说

  • 3.3+ 添加了`os.replace` 来覆盖目的地。与`rename` 一样,它在Windows 上调用`MoveFileEx`,但带有`MOVEFILE_REPLACE_EXISTING` 标志。跨文件系统移动需要复制和删除,为此 `win32api.MoveFileEx(src, dst, win32con.MOVEFILE_COPY_ALLOWED|win32con.MOVEFILE_REPLACE_EXISTING)` 可能比 `shutil.move` 快。 (3认同)