python - 最佳地从输入系列生成2个系列
问题描述
考虑一下:
A,B=[],[]
for i in range(0,n):
item=manipulate(data,i)
A += [nextSerieA(data,i,item)]
B += [nextSerieB(data,i,item)]
for a in A:
doSmt(a)
for b in B:
doSmt(b)
ifn
是非常大的数字并且manipulate
需要很长时间才能执行 ill 等待永远doSmt
被调用。
所以我想使用生成器来doSmt
更快地开始被调用,例如:
def genA():
for i in range(0,n):
item=manipulate(data,i)
yield nextSerieA(data,i,item)
def genB():
for i in range(0,n):
item=manipulate(data,i)
yield nextSerieB(data,i,item)
for a in genA():
doSmt(a)
for b in genB():
doSmt(b)
这种方法的问题在于manipulate
,输入系列中的每个项目都会被调用两次,如果操作是繁重的操作,它是多余的,我想避免它。
迈向最佳代码的下一步将是:
def manipulate():
for i in range(0,n):
yield i,manipulate(data,i)
def genA():
for i,item in manipulate():
yield nextSerieA(data,i,item)
def genB():
for i,item in manipulate():
yield nextSerieB(data,i,item)
for a in genA():
doSmt(a)
for b in genB():
doSmt(b)
但manipulate
每个输入仍会被调用两次。什么是获得我想要的东西并确保其最佳的正确方法,即manipulate
每个输入项调用一次?
解决方案
您可以使用itertools.tee,它在后台使用队列来存储生成的项目。
def manipulate():
for i in range(0,n):
yield manipulate(data,i)
(genA,genB) = itertools.tee(manipulate())
它将节省一些计算资源,因为操作将被称为每个项目一个。
但是,如果处理是如示例中的顺序处理(第一个处理 genA 和 genB),则将需要大量辅助存储。
推荐阅读
- java - 一段时间后,用户进程与 ssh 连接一起被杀死
- excel - 动态循环范围,VBA
- javascript - JavaScript - 如何从格式为“2001-08-22 03:04:05.000”的字符串创建日期?
- python - ODL XML 代码!mininet 交换机流程未显示
- node.js - 使用 Cloud Function 发送电子邮件验证
- javascript - 如何在 html 中创建图像容器
- jenkins - 如何将 .deb 文件从 jenkins Pipeline 发送到 Spinnaker Pipeline?
- javascript - 阻止第三方发送推送通知
- python - 如何根据索引对列中的数据进行分组
- r - 如何使用 R 中的函数 mutate 基于数据框中的另一个二进制变量创建新的二进制变量?