如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器
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 的迭代器的更多相关文章
- Linux 命令之split(将一个大文件根据行数平均分成若干个小文件)
把一个 txt 文件导入到 excel 中,但是 excel 单列支持的行数为 1048576,而我需要导入的 txt 文件总共有 7945674 ,我们无法一次性将整个 txt 文件里面的内容导入到 ...
- [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...
- Linux下的split 命令(将一个大文件根据行数平均分成若干个小文件)
将一个大文件分成若干个小文件方法 例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt 读出 BL ...
- 熬夜肝出5大点,18张图带你彻底弄懂MySQL事务日志
在当今社会,充斥着大量的数据.从众多APP上的账户资料到银行信用体系等个人档案,都离不开对大量数据的组织.存储和管理.而这,便是数据库存在的目的和价值.目前数据库的类型主要分为两种,一种是关系型数据库 ...
- find 命令查找文件大小为xx的文件
K:字节 G:gb 查找当前目录及子目录下大于1G的文件: # find ./ -size +1G -exec ls -lh {} \; 查找当前目录及子目录下大于1G小于20G的文件: # find ...
- 【linux应用】将一个大文件按行拆分成小文件
例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt #读出BLM.txt有多少行. 再利用 split 命令 ...
- ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [
一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...
- FtpClient上传文件速度非常慢,而且大小为0,上传失败
问题发生: 环境:VSFTP+FTPClient+Client 使用FTPClient上传文件的时候总是卡住,而且文件大小为0,上传失败, 解决方案: 添加代码:调用FTPClient的enterLo ...
- 优化sql,返回行数少情况下,NL比hash快好多
sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...
随机推荐
- vue 之 render 函数不能渲染非全局自定义函数-方案
import customCom from 'xxx.vue' render: (h) => { return h(customCom) }
- SpringBoot 项目启动 Failed to convert value of type 'java.lang.String' to required type 'cn.com.goldenwater.dcproj.dao.TacPageOfficePblmListDao';
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tac ...
- python 获取运行脚本和模块的绝对路径
方法一:sys.args[0] 在python的运行时,sys.argv[0],存了当前脚本的运行路径包括文件名 python test.py 则:sys.argv[0] =>test.py p ...
- Mac: ld: library not found for -lgcc_s.10.4
Mac: ld: library not found for -lgcc_s.10.4 Checking for cc... ld: library not found for -lgcc_s.1 ...
- 基于Kinect 2.0深度摄像头的三维重建
刚今天验收的实验,记录一下. 是比较基础的三维重建内容. 算是三维重建入门. 系统:windows 环境:visual studio 2013 语言:c++ 相关:OpenCV 2.Kinect SD ...
- Treasure Exploration POJ - 2594 【有向图路径可相交的最小路径覆盖】模板题
Have you ever read any book about treasure exploration? Have you ever see any film about treasure ex ...
- React中生命周期
1.过时的生命周期(v16.3之前) 1.当前组件初次渲染: 绿色表示执行顺序. constructor(): 如果不需要初始化,可以直接省略,会自动补全该函数. 可以在这个方法中初始化this.st ...
- learning express step(五)
learning express middleware var express = require('express'); var app = express(); var myLogger = ...
- 【概率论】1-4:事件的的并集(Union of Events and Statical Swindles)
title: [概率论]1-4:事件的的并集(Union of Events and Statical Swindles) categories: Mathematic Probability key ...
- POJ 3616 Milking Time ——(记忆化搜索)
第一眼看是线段交集问题,感觉不会= =.然后发现n是1000,那好像可以n^2建图再做.一想到这里,突然醒悟,直接记忆化搜索就好了啊..太蠢了.. 代码如下: #include <stdio.h ...