如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器

news/2024/7/20 12:26:47 标签: 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()多少个

 

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

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

 

转载于:https://www.cnblogs.com/mzfly/p/9946908.html


http://www.niftyadmin.cn/n/1018602.html

相关文章

简易计算器实现

Android简易计算器实现 实验目的&#xff1a; 自主完成一个简单APP的设计工作&#xff0c;综合应用已经学到的Android UI设计技巧&#xff0c;重点注意合理使用布局。 实验要求&#xff1a; 1. 完成一个计算器的设计&#xff0c;可以以手机自带的计算器为参考。设计过程中&…

循环单链表(CircularLinkedList) 实现

/* 循环链表是一种链式存储结构&#xff0c;它的最后一个结点指向头结点&#xff0c;形成一个环。因此&#xff0c;从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致&#xff0c;差别仅仅在于算法中的循环条件有所不同。*/namespace…

【Matlab路径规划】蚁群算法机器人大规模栅格地图最短路径规划【含源码 1860期】

一、代码运行视频&#xff08;哔哩哔哩&#xff09; 【Matlab路径规划】蚁群算法机器人大规模栅格地图最短路径规划【含源码 1860期】 二、蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接、灾后搜救、军事、太空探索、深海勘探、家用和服务行业等…

Arrow function的restore

var materials [ Hydrogen, Helium, Lithium, Beryllium ]; console.log(materials.map(material > material.length)); 标准函数形式&#xff1a; var materials [ Hydrogen, Helium, Lithium, Beryllium ]; console.log(materials.map(function…

【Matlab WSN通信】A_Star改进LEACH多跳传输协议【含源码 487期】

一、代码运行视频&#xff08;哔哩哔哩&#xff09; 【Matlab路径规划】蚁群算法机器人大规模栅格地图最短路径规划【含源码 1860期】 二、蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接、灾后搜救、军事、太空探索、深海勘探、家用和服务行业等…

二叉查找树 数组实现 ArrayBinarySearchTree

数组实现的二叉查找树 适用查找操作频繁&#xff0c;插入、删除操作较少的情况 代码 using System; namespace DataStructure {/*数组实现的二叉查找树输入一个数组&#xff0c;获得一颗二叉查找树找parent 和 child index的数值规律01,23,4,5,67,8,9,10,11,12,13,1415,16,1…

【Matlab VRP】模拟退火算法求解单中心多车辆路径规划问题【含源码 1072期】

一、代码运行视频&#xff08;哔哩哔哩&#xff09; 【Matlab VRP】模拟退火算法求解单中心多车辆路径规划问题【含源码 1072期】 二、模拟退火算法简介 1 模拟退火算法的原理 模拟退火算法&#xff08;SA&#xff09;是一种适用于大规模组合优化问题的有效近似算法&#xf…

SparkSQL 相关API

一、SQLContext.scala中的接口说明 大部分接口都是创建DataFrame 1、构造&#xff1a;SQLContext的构造只需要一个SparkContext参数 2、设置/获取 配置&#xff1a;setConf/getConf 3、isCached/cacheTable/uncacheTable/clearCache:数据缓存相关&#xff0c;提高查询速度&…