¿Hay alguna forma integrada de obtener la longitud de un iterable en Python?

Por ejemplo, los archivos, en Python, son iterables: iteran sobre las líneas del archivo. Quiero contar la cantidad de líneas.

Una forma rápida es hacer esto:

lines = len(list(open(fname)))

Sin embargo, esto carga todo el archivo en la memoria (a la vez). Esto más bien anula el propósito de un iterador (que solo necesita mantener la línea actual en la memoria).

Esto no funciona

lines = len(line for line in open(fname))

como generadores no tienen una longitud.

¿Hay alguna manera de hacer esto sin definir una función de conteo?

def count(i):
    c = 0
    for el in i: c += 1
    return c

EDITAR: Para aclarar, entiendo que todo el archivo tendrá que ser leído. Simplemente no lo quiero en la memoria de una vez =).

Respuestas a la pregunta(3)

Su respuesta a la pregunta