Самая быстрая версия без чрезмерной оптимизации кода, который у меня есть, со следующим кодом:
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".
По сравнению с shutil выигрыш для локального хранилища по сравнению с tmfps составляет около 2x-3x и около 6x для NFS для локального хранилища.
После профилирования я заметил, что shutil.copy выполняет множество syscals fstat, которые довольно тяжелы. Если кто-то хочет продолжить оптимизацию, я бы предложил сделать один fstat для src и повторно использовать значения. Честно говоря, я не пошел дальше, так как получил почти те же цифры, что и собственный инструмент копирования Linux, и оптимизация на несколько сотен миллисекунд не была моей целью.
person
Dmytro
schedule
24.01.2015
cp
для Linux и Mac иCOPY
для Windows. Они должны быть такими же быстрыми, как при использовании графического интерфейса. - person Ecno92   schedule 27.02.2014