Today I learned!
>>> import random,zlib,codecs
>>> sample = random.getrandbits(1024).to_bytes(1024, 'big') * 1024
>>> len(zlib.compress(codecs.encode(sample, 'base64')))
22083
>>> len(zlib.compress(codecs.encode(sample, 'hex')))
4326
>>>
edit: (25 minutes of digging around the Internet, and I find this):
>>> sample = os.urandom(1024) * 1024
>>> len(sample.encode('base64'))
1416501
>>> len(sample.encode('hex'))
2097152
>>> len(sample.encode('ascii85'))
1310720
>>> len(zlib.compress(sample.encode('base64')))
82169
>>> len(zlib.compress(sample.encode('hex')))
12537
>>> len(zlib.compress(sample.encode('ascii85')))
8212
Had to use Python 2.x to make use of the 'hackercodecs' package that implements ascii85, but looks like it's the best of both worlds, assuming its character set suits whatever medium you are transferring over, and decoding it on the other end doesn't require some slow code.
final edit: I'm guessing it was an accidental trick of the repetitive input data lining up well. On real data hex still wins out (which should have been obvious in hindsight):
>>> sample = ''.join(sorted(open('/usr/share/dict/words').readlines()))
>>> len(zlib.compress(sample.encode('ascii85')))
1320809
>>> len(zlib.compress(sample.encode('base64')))
1116678
>>> len(zlib.compress(sample.encode('hex')))
880651