Я скопировал этот сценарий из какой-то книги, чтобы сделать tar.bz2 некоторых папок для резервного копирования.
#!/usr/bin/env python
import tarfile, os
def make_tar(folder_to_backup, dest_folder, compression='bz2'):
if compression:
dest_ext ='.' + compression
else:
dest_ext = ''
arcname = os.path.basename(folder_to_backup)
dest_name = '%s.tar%s' % (arcname, dest_ext)
dest_path = os.path.join(dest_folder, dest_name)
if compression:
dest_cmp = ':' + compression
else:
dest_cmp = ''
out = tarfile.TarFile.open(dest_path, 'w' +dest_cmp)
out.add(folder_to_backup, arcname)
out.close()
return dest_path
print "Doing Python"
make_tar('/home/bob/public_html','/home/bob/testbck', compression='bz2')
Теперь bash делает резервную копию этой папки за 40 секунд, а python занимает около 8 минут.
Я где-то не прав, или Python всегда медленнее для этих задач
Я скопировал / вставил ваш код и попробовал оба bz2
и gz
против tar cjpf
и tar czpf
соответственно и обнаружил, что они работают одинаково. Какую версию Python вы используете? Сколько файлов на /home/bob/public_html
? Вы пробовали сначала команду tar, а затем свой сценарий или наоборот? (Я предполагаю, что кеш-файлы могут немного исказить результаты, но не настолько).
Я только что взглянул на реализацию TarFile. Это легко с ipython
, Кстати:
import tarfile
%edit tarfile.TarFile.add
И это в случае каталогов:
elif tarinfo.isdir():
self.addfile(tarinfo)
if recursive:
for f in os.listdir(name):
self.add(os.path.join(name, f), os.path.join(arcname, f), recursive, exclude)
Что я вижу, становится все медленнее по мере увеличения общего количества файлов. я догадываюсь tar
может быть более оптимизирован при обработке этого случая. Хотя это всего лишь предположение.