python遍历迭代器自动链式处理数据的代码怎么写
python遍历迭代器自动链式处理数据的代码怎么写
python遍历迭代器自动链式处理数据的代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
python遍历迭代器自动链式处理数据
pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象、借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控)
书接上文,使用迭代器链式处理数据,在Process类的__iter__方法中执行挂载的预处理方法,可以嵌套包裹多层处理方法,类似KoaJs洋葱模型,在for循环时,自动执行预处理方法返回处理后的数据
分析下述示例中输入数据依次执行顺序:travel -> deep -> shuffle -> sort -> batch,实际由于嵌套循环或设置缓存的存在,数据流式会有变化,具体如后图分析
fromtorch.utils.dataimportIterableDataset#...importrandomclassProcess(IterableDataset):def__init__(self,data,f):self.data=data#绑定处理函数self.f=fdef__iter__(self):#for循环遍历时,返回一个当前环节处理的迭代器对象returnself.f(iter(self.data))a=['a0','a1','a2','a3','a4','a5','a6','a7','a8','a9']b=['b0','b1','b2','b3','b4','b5','b6','b7','b8','b9']c=['c0','c1','c2','c3','c4','c5','c6','c7','c8','c9']#data=[[j+str(i)foriinrange(10)]forjin['a','b','c']]data=[a,b,c]deftravel(d):foriind:#print('travel',i)yieldidefdeep(d):forarrind:foriteminarr:yielditemdefshuffle(d,sf_size=5):buf=[]foriind:buf.append(i)iflen(buf)>=sf_size:random.shuffle(buf)forjinbuf:#print('shuffle',j)yieldjbuf=[]forkinbuf:yieldkdefsort(d):buf=[]foriind:buf.append(i)iflen(buf)>=3:foriinbuf:#print('sort',i)yieldibuf=[]forkinbuf:yieldkdefbatch(d):buf=[]foriind:buf.append(i)iflen(buf)>=16:foriinbuf:#print('batch',i)yieldibuf=[]#对训练数据进行的多个预处理步骤dataset=Process(data,travel)dataset=Process(dataset,deep)dataset=Process(dataset,shuffle)dataset=Process(dataset,sort)train_dataset=Process(p,batch)#可在此处断点测试foriinp:print(i,'train')#train_data_loader=DataLoader(train_dataset,num_workers=args.num_workers,prefetch_factor=args.prefetch)#train(model,train_data_loader)
由上可以构造数据流式方向 :batch(iter(sort(iter(shuffle(iter(deep(iter(travel(iter( d ))))))))))
根据数据流式抽取部分过程画出时序图如下:
附:python 手动遍历迭代器
想遍历一个可迭代对象中的所有元素,但是却不想使用for 循环
为了手动的遍历可迭代对象,使用next() 函数并在代码中捕获StopIteration 异常。比如,下面的例子手动读取一个文件中的所有行
defmanual_iter():withopen('/etc/passwd')asf:try:whileTrue:line=next(f)print(line,end='')exceptStopIteration:pass
通常来讲, StopIteration 用来指示迭代的结尾。然而,如果你手动使用上面演示的next() 函数的话,你还可以通过返回一个指定值来标记结尾,比如None 。下面是示例:
withopen('/etc/passwd')asf:whileTrue:line=next(f)iflineisNone:breakprint(line,end='')
大多数情况下,我们会使用for 循环语句用来遍历一个可迭代对象。但是,偶尔也需要对迭代做更加精确的控制,这时候了解底层迭代机制就显得尤为重要了。下面的交互示例向我们演示了迭代期间所发生的基本细节:
>>>items=[1,2,3]>>>#Gettheiterator>>>it=iter(items)#Invokesitems.__iter__()>>>#Runtheiterator>>>next(it)#Invokesit.__next__()1>>>next(it)2>>>next(it)3>>>next(it)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>StopIteration>>>
看完上述内容,你们掌握python遍历迭代器自动链式处理数据的代码怎么写的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
推荐阅读
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...
-
Python如何利用D3Blocks绘制可动态交互的图表
-
2021年度编程语言揭晓
-
PPython:PHP 拥抱 Python 的利器
-
哪种Python IDE最适合你?这里有一份优缺点列表
-
Python分隔字符串函数用法split
aaa,bbb=str.split(‘&&’,2)第一个参数为分隔符第二个参数是要完成的最大拆分数...
-
php安全编程——python测试实例编写
-
神奇的Python模块:pdfkit,将Python抓取的网址内容保存pdf文件