Skip to content
This repository has been archived by the owner on Aug 2, 2018. It is now read-only.
/ pyfastcopy Public archive

Speed up Python's shutil.copyfile by using sendfile system call

Notifications You must be signed in to change notification settings

desbma/pyfastcopy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pyfastcopy

Latest version Tests status Coverage Supported Python versions

[ This project is no longer maintained, as Python 3.8 will include similar copy speedup builtin. ]

pyfastcopy is a simple Python module that monkey patches the shutil.copyfile function of Python standard library to internally use the sendfile system call.

It can provide important performance improvements for large file copy (typically 30-40%). See the performance section for some numbers.

Because shutil.copyfile is used by other fonctions in the shutil module, the following functions also automatically benefit from the performance boost:

  • shutil.copy
  • shutil.copy2
  • shutil.copytree

If sendfile is not available on your system or fails, the classic, slower chunk file copy is used, so there is no downside to using this module.

For more information, see my proposed patch for Python.

Performance

Tests were done copying files (source and destination) on a tmpfs filesystem, so that no slowdown related to hard drive or SSD storage occurs. Test files were generated with pseudo random data using frandom.

See benchmark.py for details about the test procedure and how the following graphs were generated.

Python 3.4: graph1 graph2 graph3

Python 3.6: graph4 graph5 graph6

These tests show a 30-50% performance improvement of shutil.copyfile compared to stock Python.

Usage

Just import the module:

import pyfastcopy

And then use the patched shutil.copyfile as usual:

shutil.copyfile(src, dst)

The sendfile system call does not exist on Windows, so importing this module will have no effect.

Installation

From PyPI (with PIP)

  1. If you don't already have it, install pip for Python 3 (not needed if you are using Python >= 3.4)
  2. Install pyfastcopy: pip3 install pyfastcopy
  3. Enjoy fast copy when using shutil.copyfile, shutil.copy, shutil.copy2 or shutil.copytree

From source

  1. If you don't already have it, install setuptools for Python 3
  2. Clone this repository: git clone https://github.com/desbma/pyfastcopy
  3. Install pyfastcopy: python3 setup.py install
  4. Enjoy fast copy when using shutil.copyfile, shutil.copy, shutil.copy2 or shutil.copytree

License

Python Software Foundation License

About

Speed up Python's shutil.copyfile by using sendfile system call

Resources

Stars

Watchers

Forks

Packages

No packages published