¿Cómo medir la velocidad de descarga y el progreso utilizando peticiones?

estoy usandorequests para descargar archivos, pero para archivos grandes necesito comprobar el tamaño del archivo en el disco cada vez que no puedo mostrar el progreso en porcentaje y también me gustaría saber la velocidad de descarga. ¿Cómo puedo hacerlo? Aquí está mi código:

import requests
import sys
import time
import os

def downloadFile(url, directory) :
  localFilename = url.split('/')[-1]
  r = requests.get(url, stream=True)

  start = time.clock()
  f = open(directory + '/' + localFilename, 'wb')
  for chunk in r.iter_content(chunk_size = 512 * 1024) :
        if chunk :
              f.write(chunk)
              f.flush()
              os.fsync(f.fileno())
  f.close()
  return (time.clock() - start)

def main() :
  if len(sys.argv) > 1 :
        url = sys.argv[1]
  else :
        url = raw_input("Enter the URL : ")
  directory = raw_input("Where would you want to save the file ?")

  time_elapsed = downloadFile(url, directory)
  print "Download complete..."
  print "Time Elapsed: " + time_elapsed


if __name__ == "__main__" :
  main()

Creo que una forma de hacerlo sería leer el archivo cada vez que sefor Recorrer y calcular el porcentaje de progreso basado en el encabezado.Content-Length. Pero eso sería otra vez un problema para archivos grandes (alrededor de 500 MB). ¿Hay alguna otra forma de hacerlo?