jjzjj

Generator

全部标签

python - 多处理 - 读取大输入数据 - 程序挂起

我想对从文件加载的一些输入数据运行并行计算。(文件可能非常大,所以我为此使用了一个生成器。)在一定数量的项目上,我的代码运行正常,但高于此阈值时程序挂起(一些工作进程未结束)。有什么建议吗?(我用python2.7、8个CPU运行它;5,000行仍然可以,7,500行不起作用。)首先,您需要一个输入文件。在bash中生成它:foriin{0..10000};doecho-e"$i"'\r'>>counter.txt;done然后,运行这个:python2.7main.py100counter.txt>run_log.txtma​​in.py:#!/usr/bin/python2.7im

python - 在 xrange 对象上调用多个迭代器

为什么zip(*[xrange(5)]*2)给出[(0,0),(1,1),(2,2),(3,3),(4,4)]但是zip(*[iter(xrange(5))]*2)给出[(0,1),(2,3)]?我一直认为生成器是迭代器,所以生成器上的iter是空操作。例如,list(iter(xrange(5)))[0,1,2,3,4]与相同list(xrange(5))[0,1,2,3,4](对于Python3也是如此,但是使用list(zip(和range。) 最佳答案 iterable和iterator之间是有区别的。您可以使用iter(x

python - 如何从生成器中获取元组?最佳实践

我是一名新手程序员,我想创建一个生成器,它会返回两个值,我将在另一个函数中将其用作元组。我不明白为什么tuple(function_1(a,b))返回((1,2),)而tuple(function_2(a,b))将返回一个正确的元组。我想知道这里发生了什么,什么是最好的语法,并最终知道是否可以从function_1中检索元组。提前感谢您的任何解释!>>>deffunction_1(a,b):...yielda,b...>>>deffunction_2(a,b):...yielda...yieldb...>>>a=1>>>b=2>>>>>>function_1(a,b)>>>functi

python - 有限生成器的长度

我有这两个实现来计算有限生成器的长度,同时保留数据以供进一步处理:defcount_generator1(generator):'''-buildalistwiththegeneratordata-getthelengthofthedata-returnboththelengthandtheoriginaldata(inalist)WARNING:thememoryuseisunbounded,andinfinitegeneratorswillblockthis'''l=list(generator)returnlen(l),ldefcount_generator2(generator

python - 在生成器中引发异常,在其他地方处理它,反之亦然在 python 中

我正在考虑更高级的方向以及更难找到解决这个问题的方法。在做出任何决定之前,我想过征求专家的意见来解决这个问题。增强型生成器具有新方法.send()和.throw(),允许调用者传递消息或引发异常到生成器(协程)。来自python文档:这非常方便,尤其是请求生成器处理调用方引发的异常的.throw()方法。请求#1:上述语句的任何示例代码。我没有找到此解释的任何代码片段。但是,我也在考虑相反的问题:生成器是否可以引发异常,将其传递给调用者,让调用者“修复”它,然后继续生成器自己的执行?这就是我想称之为“反向throw”的东西。请求#2:上述语句的任何示例代码。我没有找到此解释的任何代码片

python - 并行化一系列生成器

假设我有如下所示的Python流处理代码:defF1(stream):forxinstream:yieldf1(x)defF2(stream):forxinstream:yieldf2(x)defF3(stream):forxinstream:yieldf3(x)defF4(stream):forxinstream:yieldf4(x)forxinF4(F3(F2(F1(range(1000000))))):print(x)这大致相当于range1000000|F1|F2|F3|F4在Unix中(假设一个range命令),但在Unix中管道中的每个进程并行运行。是否有一种简单的方法来并

python - Python 递归生成器如何工作?

在Pythontutorial中,我了解到Likefunctions,generatorscanberecursivelyprogrammed.Thefollowingexampleisageneratortocreateallthepermutationsofagivenlistofitems.defpermutations(items):n=len(items)ifn==0:yield[]else:foriinrange(len(items)):forccinpermutations(items[:i]+items[i+1:]):yield[items[i]]+ccforpinpe

生成器的 python 生成器?

我写了一个读取txt文件的类。该文件由非空行block组成(我们称它们为“部分”),由空行分隔:line1.1line1.2line1.3line2.1line2.2我的第一个实现是读取整个文件并返回一个列表列表,即一个部分列表,其中每个部分都是一个行列表。这显然在内存方面很糟糕。所以我将它重新实现为列表生成器,即在每个周期我的类都将内存中的整个部分作为列表读取并生成它。这样比较好,但是在大段的情况下还是有问题。所以我想知道我是否可以将它重新实现为生成器的生成器?问题是这个类非常通用,它应该能够满足这两种用例:读取一个非常大的文件,包含非常大的部分,并且只循环一次。生成器的生成器非常适

python - 如何知道生成的序列最多一定长度

我想知道生成的序列是否少于2个条目。>>>defsequence():...foriinxrange(secret):...yieldi我低效的方法是创建一个列表,然后测量它的长度:>>>secret=5>>>len(list(sequence()))显然,这会消耗整个生成器。在我的真实案例中,生成器可能正在穿越一个大型网络。我想在不消耗整个生成器或构建一个大列表的情况下进行检查。有一个recipeintheitertoolsdocumentation:deftake(n,iterable):"Returnfirstnitemsoftheiterableasalist"returnli

python - 生成器表达式与 for 循环的丑陋组合

以下出现在我的Python2.6代码中:forsrc,dstin([s,d]forsinuniversefordinuniverseifs!=d):我能做得更好吗?我特别不喜欢的是我实际上指定了同一对两次,一次用于for循环,另一次用于生成器表达式。我不确定我是否愿意:forsrc,dstinitertools.product(universe,universe):ifsrc!=dst:有没有办法简洁地表达这个循环?universe恰好是一个列表,如果它有任何区别的话。迭代顺序无关紧要。 最佳答案 您可以使用简单的嵌套for循环:f