За исключением итерации через повторяемое и подсчета количества повторений, нет. Это - то, что делает его повторяемым и не списком. Это не действительно даже определенная для Python проблема. Посмотрите на классическую структуру данных связанного списка. Нахождение длины является O (n) операция, которая включает итерацию целого списка для нахождения числа элементов.
Как mcrute упомянутый выше, можно, вероятно, уменьшить функцию до:
def count_iterable(i):
return sum(1 for e in i)
, Конечно, при определении собственного повторяемого объекта можно всегда реализовывать __len__
сами и проводить подсчет элемента где-нибудь.
При необходимости в количестве строк, можно сделать это, я не знаю ни о каком лучшем способе сделать это:
line_count = sum(1 for line in open("yourfile.txt"))
Абсолютно не, по простой причине, что iterables, как гарантируют, не будут конечны.
Рассматривают эту совершенно легальную функцию генератора:
def forever():
while True:
yield "I will run forever"
Попытка вычислить длину этой функции с len([x for x in forever()])
не будет ясно работать.
, Поскольку Вы отметили, большая часть цели итераторов/генераторов состоит в том, чтобы быть в состоянии работать над большим набором данных, не загружая все это в память. То, что Вы не можете получить непосредственную длину, нужно считать компромиссом.
Я использовал это переопределение в течение некоторого времени теперь:
def len(thingy):
try:
return thingy.__len__()
except AttributeError:
return sum(1 for item in iter(thingy))
Мы будем, если Вы будете думать об этом, как Вы предлагаете, чтобы Вы нашли количество строк в файле, не читая целый файл для новых строк? Несомненно, можно найти размер файла, и если Вы можете gurantee, что длина строки является x, можно получить количество строк в файле. Но если у Вас нет некоторого ограничения, мне не удается видеть, как это может работать вообще. Кроме того, так как iterables может быть бесконечно длинным...