如何用最快的速度读出大小为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()多少个

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

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

原文地址:https://www.cnblogs.com/mzfly/p/9946908.html

时间: 2024-10-08 23:31:24

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

查看大文件的行数(windows 和 Ubuntu)

Windows 在Windows平台上,我们可以使用很多工具来打开文件,查看其行数,最常用的就是MS Office Word.记事本等.在MS-DOS下,我们还可以使用edit模式来打开文件,但其最多能打开65280行数据.这里推荐一个工具notepad++,这个工具能打开并显示更多行的数据,并且自动显示行号. Ubuntu 在Ubuntu平台上,我们可以使用 wc 命令在不打开文件的情况下,来统计文件的信息. 比如: wc -l myfile.txt 统计文件的行数 wc -m myfile.

[获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...

背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文件的行数的方法 $temp_file = 'error.log'; $fp = fopen($temp_file ,'r') or die("open file failure!"); $total_line = 0; if($fp){     /* 获取文件的一行内容,注意:需要php5

Linux下的split 命令(将一个大文件根据行数平均分成若干个小文件)

将一个大文件分成若干个小文件方法 例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt       读出 BLM.txt 文件一共有多少行 再利用 split 命令 split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_ 将 文件 BLM.txt 分成若干个小文件,每个文件2482行(-l 2482),文件前缀为BLM_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4

实战 | 如何用最快的速度学会Dlib人脸识别开发?

项目GitHub地址:https://github.com/xiaosongshine/dlib_face_recognition 1.背景介绍 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch.但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发.上面所说的人脸识别开发,主要是指人脸验证,就是输入两张人脸照片,系统会对比输出0或者1,代表判断是

大文件按行分离脚本

1 #!/bin/bash 2 #大文件按行数分离成若干小文件脚本 3 4 con_data='db2 connect to db_edp' 5 con_time='db2 "values current timestamp"' 6 con_reset='db2 connect reset' 7 #将要分离的文件名写到此处,其它地方不要改动 8 clear_file=pdm_20160512.txt 9 10 echo $con_data > lianjie.txt 11 ech

#10.09# 活动预告:iPad大奖,快来Mark 9大产品评测活动!

#10.09#活动预告:iPad大奖,快来Mark 9大产品评测活动! 亲爱的阿里云小伙伴们: 云产品的多样性(更多的云产品)也是让用户深度使用云计算的关键.今年阿里云产品线越来越丰富,小云搜罗了一下,居然有9个产品在免费公测. 为了协助您上手新的云产品,借助阿里云9大产品免费公测活动,您可以测试工作负载,运行应用程序:还可以通过评测文章交流,学习到更多知识,为您构建合适的云产品解决方案. 趁UED哥哥在忙着做活动页面,虽然还要等好几天才能做好活动页面,可素,我已等不及要把活动的好消息放出来啦.

你的以太网速度足够快吗?四种更快的速度正在路上&amp;#183;&amp;#183;&amp;#183;&amp;#183;&amp;#183;&amp;#183;

以太网的未来将远远超越下一个最快速度:为无处不在的网络协议绘制路径的网络project师们正在寻找新版本号来服务于各种应用程序. 在上周六的以太网联盟(一个行业组织,用于促进IEEE以太网标准)会议上,三大新项目被提出来讨论.为了x满足数据云中心的迫切需求,确立了25Gbps(字节/秒)的以太网速率标准.但鉴于未来几年内数据云的迅猛发展,专家已经在商讨50Gbps的速率标准了.对于那些新的.高速Wi-Fi接入的企业来说.立即就要实现2.5Gbps的以太网速率.除此之外,未来的最高时速主要将被应用

如何评价苹果中国官网 iOS 8 介绍页面的文案「开发者的大事、大快所有人心的大好事」?[转自知乎]

在什么是「苹果式中文」答案中,小七得出了这个结论: 「苹果式中文」是指句子结构破碎,经常缺乏主语,滥用排比,顶真,偏正短语,和不恰当四字词的广告文体. (有关什么是苹果式中文,小七原来贴错地方了TAT,具体分析请移步:什么是「苹果式中文」?) 那么作为广告翻译,苹果做得如何呢? 首先,有个翻译的概念需要向大家普及: 很多知友提出文案有明显的翻译腔,这个说法其实不准够确啊,有关什么是翻译腔,我的分析请移步:什么是「翻译腔」?「翻译腔」是好是坏? 在这里节选原文一段补充说明: 3. 明明能说中文,非

100万个数据,数据值在0~65535之间,请用尽可能少的内存和最快的速度从小到大排序

场景说明:100万个数据,数据值在0~65535之间,请用尽可能少的内存和最快的速度从小到大排序 voidsort(int* array, int n) { //n的值在100万左右 //你的实现 } 我们首先观察到所有的数据已经保存到了array数组中,现在我们需要做的就是将数组中的元素排序.现在我们把数组中的元素提取出来比如是3,然后我们提取出数组下标是3的元素,保存到临时空间,通过负数来计算个数: void sort(int* array, int n) {     int tmp=0;