Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?
更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能很长.
更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?
如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义
def ilen(it):
return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)
但我明白lambda接近被认为是有害的,lambda _: 1当然不是很漂亮.
(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c.)
例如,Python中的文件是可迭代的 - 它们遍历文件中的行.我想计算行数.
一个快速的方法是这样做:
lines = len(list(open(fname)))
Run Code Online (Sandbox Code Playgroud)
但是,这会将整个文件加载到内存中(一次).这相当违背了迭代器的目的(它只需要将当前行保留在内存中).
这不起作用:
lines = len(line for line in open(fname))
Run Code Online (Sandbox Code Playgroud)
因为发电机没有长度.
有没有办法做到这一点,没有定义计数功能?
def count(i):
c = 0
for el in i: c += 1
return c
Run Code Online (Sandbox Code Playgroud)
编辑:澄清,我明白整个文件必须阅读!我只是不想在内存中一次性=).
我有一个生成有限序列的生成器.为了确定这个序列的长度,我尝试了这两种方法:
seq_len = sum([1 for _ in euler14_seq(sv)]) # list comp
Run Code Online (Sandbox Code Playgroud)
和
seq_len = sum(1 for _ in euler14_seq(sv)) # generator expression
Run Code Online (Sandbox Code Playgroud)
sv 是序列的常量起始值.
我原本以为列表理解会慢一点,生成器表达式会更快,但事实证明相反.
我假设第一个会占用更多的内存,因为它首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢.
我的问题:这种观察是否可以推广?这是因为第二个声明与第一个声明中涉及两个发生器吗?
我看过这些什么是计算生成器/迭代器中项目数的最短方法?,生成器输出的长度, 是否有任何内置的方法来获取python中迭代的长度?并且看到了一些测量序列长度的其他方法,但我对list comp与generator表达式的比较特别好奇.
PS:当我决定根据昨天提出的问题解决欧拉项目#14时出现了这个问题.
(顺便说一句,关于使用'_'不需要变量值的地方的一般感觉是什么).
这是在Windows 7 64位下使用Python 2.7.2(32位)完成的
假设我有一个列表:
my_list = range(10)
Run Code Online (Sandbox Code Playgroud)
而且我想计算列表中有多少偶数.请注意,我对这些值不感兴趣,我只想要它们的数量.所以我可以:
len( [0 for i in my_list if i % 2 == 0] ) # Method 1
len( [i for i in my_list if i % 2 == 0] ) # Method 2
len( [_ for i in my_list if i % 2 == 0] ) # Method 3
Run Code Online (Sandbox Code Playgroud)
从速度或内存的角度来看,上述任何一种方法都比其他方法更好吗?
实际上我甚至不需要构建列表,但我不想:
counter = 0
for item in my_list:
if item % 2 == 0:
counter += 1
Run Code Online (Sandbox Code Playgroud)
那么,哪一个是用发电机计数的好方法?
PS:我的案例中的列表有更多内存繁重的项目,这就是为什么我想要尽可能优化.