Existe alguma maneira interna de obter o comprimento de um iterável em python?

Por exemplo, os arquivos no Python são iteráveis - eles repetem as linhas do arquivo. Eu quero contar o número de linhas.

Uma maneira rápida é fazer isso:

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

No entanto, isso carrega o arquivo inteiro na memória (de uma só vez). Isso acaba com o objetivo de um iterador (que só precisa manter a linha atual na memória).

Isso não funciona:

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

como geradores não têm um comprimento.

Existe alguma maneira de fazer isso sem definir uma função de contagem?

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

EDIT: Para esclarecer, entendo que o arquivo inteiro terá que ser lido! Eu só não quero isso na memória de uma só vez =).

questionAnswers(3)

yourAnswerToTheQuestion