Python实现迭代器

####一. iterator
deep learning for nlp, 在构建模型之后,总是设计到数据处理的问题,需要将很大的文件split为一个个的batch, 用一个迭代器来做这件事情,代码看起来显得异常优雅,那么如果来构建自己的迭代器呢?我们来看一下python迭代器实现的内部机制。
我们比较常见到的迭代器的形式是:for i in obj
程序在执行这句话的时候,底层代码其实执行的是这样的:

_iter = obj.__iter__()  
while true:  
    try:  
        x = _iter.next()  
    except StopIteration:  
        break  
# statements 

从上面的例子可以看出来,实现一个迭代器,需要实现__iter__()方法和next(), 以及终止条件StopIteration
其中__iter__()方法返回迭代器类本身,而next方法则是返回每次需要的元素。

那么比如在深度学习中,batch处理数据,就需要这样的迭代器来处理数据,刚好最近在做的一个小事情需要写一个,读取数据,使用的是numpy的loadtx,代码如下:

class Hidden_iterator(object):
    def __init__(self, source, soure2, label,
                 batch_size=128):
        self.source_file = source
        self.target_file = soure2
        self.label_file = label
        self.batch_size = batch_size

        self.end_of_data = False
        self.start_position = 0

        # ### 读取文件
        self.source = np.loadtxt(self.source_file)
        self.target = np.loadtxt(self.target_file)
        self.label = np.loadtxt(self.label_file, dtype=int)
        self.end = self.source.shape[0]

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):

        if self.end_of_data:
            raise StopIteration

        ss = self.start_position
        ee = self.start_position + self.batch_size
        self.start_position += self.batch_size
        if ee >= self.end:
            self.end_of_data = True
            ss = self.end - self.batch_size

        return self.source[ss:ee], self.target[ss:ee], self.label[ss:ee]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值