python如何快速复制文件_Python:如何快速复制文件

小编典典

最快的版本,没有使用以下代码过度优化我的代码:

class CTError(Exception):

def __init__(self, errors):

self.errors = errors

try:

O_BINARY = os.O_BINARY

except:

O_BINARY = 0

READ_FLAGS = os.O_RDONLY | O_BINARY

WRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | O_BINARY

BUFFER_SIZE = 128*1024

def copyfile(src, dst):

try:

fin = os.open(src, READ_FLAGS)

stat = os.fstat(fin)

fout = os.open(dst, WRITE_FLAGS, stat.st_mode)

for x in iter(lambda: os.read(fin, BUFFER_SIZE), ""):

os.write(fout, x)

finally:

try: os.close(fin)

except: pass

try: os.close(fout)

except: pass

def copytree(src, dst, symlinks=False, ignore=[]):

names = os.listdir(src)

if not os.path.exists(dst):

os.makedirs(dst)

errors = []

for name in names:

if name in ignore:

continue

srcname = os.path.join(src, name)

dstname = os.path.join(dst, name)

try:

if symlinks and os.path.islink(srcname):

linkto = os.readlink(srcname)

os.symlink(linkto, dstname)

elif os.path.isdir(srcname):

copytree(srcname, dstname, symlinks, ignore)

else:

copyfile(srcname, dstname)

# XXX What about devices, sockets etc.?

except (IOError, os.error), why:

errors.append((srcname, dstname, str(why)))

except CTError, err:

errors.extend(err.errors)

if errors:

raise CTError(errors)

此代码的运行速度比本地linux“ cp -rf”慢。

比较本地存储到tmfps的收益大约是2倍至3倍,而NFS到本地存储则是6倍左右。

分析后,我注意到shutil.copy做了很多非常重要的fstat

syscal。如果要进一步优化,我建议对src做一个fstat并重用这些值。老实说,我没有走更远的一步,因为我得到的数字几乎与本地linux复制工具相同,而优化几百毫秒并不是我的目标。

2021-01-20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值