例如,Python中的文件是可迭代的-它们遍历文件中的各行。我想计算行数。
一种快速的方法是执行此操作:
lines = len(list(open(fname)))
但是,这会将整个文件一次加载到内存中。这反而违反了迭代器的目的(仅需要将当前行保留在内存中)。
这不起作用:
lines = len(line for line in open(fname))
因为发电机没有长度。
除了定义计数功能外,还有什么方法可以做到这一点?
def count(i): c = 0 for el in i: c += 1 return c
为了澄清,我知道必须读取整个文件!我只是不想一次全部存储在内存中
缺少迭代遍历和计算迭代次数的方法。这就是使其成为可迭代的而不是列表的原因。这实际上甚至不是特定于python的问题。看一下经典的链表数据结构。查找长度是一个O(n)操作,涉及对整个列表进行迭代以查找元素的数量。
正如上面提到的,您可以将函数缩减为:
def count_iterable(i): return sum(1 for e in i)
当然,如果要定义自己的可迭代对象,则始终可以实现__len__自己并将元素计数保持在某个位置。
__len__