简体   繁体   English

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

[英]shutil.move() slower than os.remove() + os.rename()

So, I noticed that when I want to move a file 'a' and overwrite the destination 'b' os.remove('b') and then os.rename('a','b') is a lot faster than shutil.move('a','b'). 因此,我注意到,当我想移动文件'a'并覆盖目标位置'b'时,os.remove('b')然后os.rename('a','b')的速度比shutil快得多.move('a','b')。

I've read that : 我读过

If the destination is on the current filesystem, then os.rename() is used. 如果目标位于当前文件系统上,则使用os.rename()。 Otherwise, src is copied (using shutil.copy2()) to dst and then removed. 否则,将src复制(使用shutil.copy2())到dst,然后将其删除。 In case of symlinks, a new symlink pointing to the target of src will be created in or as dst and src will be removed. 对于符号链接,将在dst中或作为dst创建指向src目标的新符号链接,并删除src。

but why doesn't it use os.remove() also? 但是为什么它还不使用os.remove()?

Example (1st time using timeit, sorry if I have any mistakes): 示例(第一次使用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))

prints: 印刷品:

shutil.move(): 0.81 shutil.move():0.81

os.rename(): 0.052 os.rename():0.052

There is no guarantee that os.rename(src, dst) works if src and dst are on different filesystems. 如果srcdst在不同的文件系统上os.rename(src, dst)则不能保证os.rename(src, dst)可以工作。 And it does not work on Windows if dst exists. 如果存在dst ,则无法在Windows上使用。

Just as the docs say 正如文档所说

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM