zoukankan      html  css  js  c++  java
  • 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器

    1 with open('rm_keys.txt', 'r', encoding = 'utf-8') as f:
    2 
    3     count = 0
    4 
    5 for line in f:
    6 
    7   count += 1
    8 
    9   print(count)

      for line in f 将文件对象 f 视为一个可迭代的数据类型,会自动使用 IO 缓存和内存管理,这样就不必担心大文件了。


    一、先理解可迭代对象的本质
      随便封装了一个可以存放多条数据的类型是不能迭代的——需要添加了__iter__方法。
      可迭代对象的本质就是提供一个这样的中间“人”即迭代器,帮助我们对其进行迭代遍历使用。
      可迭代对象是一个具备了__iter__方法的对象,通过__iter__方法获取可迭代对象的迭代器。


    二、跌代器好处:实时生成数据,节省内存


    三、迭代器的作用:具体指定下一个数据

    四、如何使用迭代器

      先获取迭代器:[可迭代对象].__iter__()
      再用next()函数来获取下一个元素

    五、判断是否是迭代器:

      from collection import Iterator
      isinstance(对象,Iterator)
      判断的依据是有没有__iter__()方法和__next__()方法

     六、for...in...循环的本质

      先得到这个可迭代对象的迭代器iter(对象)
      使用while循环不断得遍历下一个值next(迭代器)
      直到遍历到已经没有下一个值了(会报异常StopIteration)
      退出循环

    七、举个例子

    数学中有个著名的斐波拉契数列(Fibonacci)

    数列中第一个数为0,第二个数为1

    其后的每一个数都可由前两个数相加得到:

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

    现在我们先通过for...in...循环来遍历迭代斐波那契数列中的前n个数:

    class Fib(object):
        def __iter__(self):
            return self
    
        def __next__(self):
            pass
    
    fib = Fib()
    
    for i in fib:
        print(i)
    
    
    # 一次性的到结果:0, 1, 1, 2, 3, 5, 8, 13....

    这个斐波那契数列我们可以用迭代器来实现,

    每次迭代都通过数学计算来生成下一个数。

    使用迭代器的形式实现:

    class Fib(object):
        def __init__(self, num):
            self.num = num   # 表示前n项
            self.a = 0     # 前一个值
            self.b = 1     # 后一个值
            self.i = 0    # 次数
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.i < self.num:
                ret = self.a
                self.a, self.b = self.b, self.a+self.b
                self.i += 1
                return ret
            else:
                raise StopIteration
    
    fib = Fib(10)
    
    print(next(fib))
    print(next(fib))
    print(next(fib))
    print(next(fib))
    for i in fib:
        print(i)

    # 想要多少个就next()多少个

    八、有了迭代器,接下就可以了解生成器

      生成器是一种特殊的迭代器,它比迭代器更优雅

  • 相关阅读:
    设置nginx中文件上传的大小限制度
    百度编辑器(ueditor)踩坑,图片转存无法使用
    帝国cms更换Ueditor编辑器上传图片加水印
    帝国cms7.5整合百度编辑器ueditor教程
    帝国CMS万能标签ecmsinfo介绍
    帝国CMS排行榜调用标签
    通过案例理解position:relative和position:absolute
    帝国CMS万能标签标题截取后自动加入省略号
    linux 安装字体
    Ecms7.5版CK编辑器保留word格式如何修改
  • 原文地址:https://www.cnblogs.com/mzfly/p/9946908.html
Copyright © 2011-2022 走看看