with open('rm_keys.txt', 'r', encoding = 'utf-8') as f:

     count = 0

 for line in f:

7   count += 1

   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()多少个

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

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

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

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

    把一个 txt 文件导入到 excel 中,但是 excel 单列支持的行数为 1048576,而我需要导入的 txt 文件总共有 7945674 ,我们无法一次性将整个 txt 文件里面的内容导入到 ...

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

    背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...

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

    将一个大文件分成若干个小文件方法 例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt       读出 BL ...

  4. 熬夜肝出5大点,18张图带你彻底弄懂MySQL事务日志

    在当今社会,充斥着大量的数据.从众多APP上的账户资料到银行信用体系等个人档案,都离不开对大量数据的组织.存储和管理.而这,便是数据库存在的目的和价值.目前数据库的类型主要分为两种,一种是关系型数据库 ...

  5. find 命令查找文件大小为xx的文件

    K:字节 G:gb 查找当前目录及子目录下大于1G的文件: # find ./ -size +1G -exec ls -lh {} \; 查找当前目录及子目录下大于1G小于20G的文件: # find ...

  6. 【linux应用】将一个大文件按行拆分成小文件

    例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt #读出BLM.txt有多少行. 再利用 split 命令 ...

  7. ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [

    一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...

  8. FtpClient上传文件速度非常慢,而且大小为0,上传失败

    问题发生: 环境:VSFTP+FTPClient+Client 使用FTPClient上传文件的时候总是卡住,而且文件大小为0,上传失败, 解决方案: 添加代码:调用FTPClient的enterLo ...

  9. 优化sql,返回行数少情况下,NL比hash快好多

    sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...

随机推荐

  1. 10—mybatis 通用mapper插件 pagehelper 分页

    spring boot真的太好用了,大家以后多多使用,今天来说说pagehelper 来做mybatis分页,我用的是spring boot 做的开发,后面会把源码发出来. pagehelper(ht ...

  2. JSONP劫持

    发出空refer的POC <!DOCTYPE html> <html> <head> <meta name="referrer" cont ...

  3. Codeforces Round #584 C. Paint the Digits

    链接: https://codeforces.com/contest/1209/problem/C 题意: You are given a sequence of n digits d1d2-dn. ...

  4. [Google Guava] 8-区间

    原文链接 译文链接 译文:沈义扬 范例 1 List scores; 2 Iterable belowMedian =Iterables.filter(scores,Range.lessThan(me ...

  5. 钉钉中设置代码提交提醒--Github机器人(转)

    生成GitHub机器人webhook 从PC端或者手机端的群机器人入口进入到机器人管理页面,选择“GitHub机器人”,按照设置流程生成GitHub机器人,即可获取到相应群的webhook,其格式如下 ...

  6. 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)

    #!/bin/bash#设置变量定义需要添加到防火墙规则的服务和端口号#使用 firewall-cmd --get-services 可以查看 firewall 支持哪些服务 service=&quo ...

  7. 页面的beforeunload和unload的事件应用

    博主最近遇到一个需求,需要在用户离开之前给一个提示,是否确认离开,并且用户确认离开的话,需要发出一个请求 下面直接上代码: <!DOCTYPE HTML> <html> < ...

  8. 8月清北学堂培训 Day1

    今天是赵和旭老师的讲授~ 动态规划 动态规划的基本思想 利用最优化原理把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 更具体的,假设我们可以计算出小问题的最优解,那么我们凭借此可 ...

  9. 2019.6.28 校内测试 T1 Jelly的难题1

    这题面有点难理解,建议直接跳到题意解释那一部分(虽然我觉得解释的不大对,但按照解释来做确实能AC): 按照“题意解释”的思路来思考这个题,那么就十分的简单了: 1.首先要读入这个字符矩阵,可以用cin ...

  10. while 循环 continue break 用法例子

    py2 temp = "理解" # utf- 8 #解码, 需要指定原来的是什么编码 temp_unicode = temp.decode("utf-8") # ...