Use "from ... import" rather than import as

Similar functionality, less repitition and more idiomatic.
Force use of response buffering via monkeypatch

Since Python 2.7, getresponse supports an undocumented
'buffering' keyword argument that can avoid many small system
calls.
Make pipeline finish() imply flush() and close()

Upon inspection, this API which demands a caller call flush() and
close() ahead of finishing the pipeline is begging to be misused.
Instead, do the reasonable thing and make finish() imply a flush() and
close().
Overhaul pipe and buffering code to greatly increase performance

Generally, the trick is to perform larger system calls while not doing
too much memory copying.

To do this, several measures are taken together:

* Adjust kernel pipe buffering to be larger if possible.

* Monkey-patch tarfile to perform pipe-buffer aligned reads and
  writes.

* Take control of buffering of non-blocking pipes to attempt large,
  kernel pipe buffer-aligned accesses.
Move large tar member write blocking file I/O out of main process

WAL-E uses cooporative scheduling via gevent.  As a result, long
system calls that block execution can cause stalling in other
greenlets.

That is a particularly common occurrence when downloading backups
quickly and write() can block for long periods.

To blunt that, write out files larger than the OS pipe buffer via a
'cat' connected to Python via a non-blocking pipe.  Even should 'cat'
block, this will present as an EAGAIN in Python, allowing another
cooporative task to be scheduled.
Use module import rather than function import

Function imports make mocking harder and are less consistent with modern
WAL-E style.
Use larger buffers for temporary file reads for performance

As witnessed this would otherwise perform small 8K reads by default.
Reduce the amount of syscall thrashing and memory shuffling by Python
by asking for larger amounts from the kernel at a time.

It might be better if one could use the "async I/O via cat" trick.
That would allow the program to schedule concurrent operations more
aggressively.  However, that is hard to do because of boto's
key.set_contents_from_file assumes a non-stream file object with .tell
and .seek operators.