如何用最快的速度读出大小为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 ...
随机推荐
- Flask实现简单的群聊和单聊
Flask是使用python写的一个简单轻量级的框架,今天我们使用Flask实现一个简单的单聊和群聊功能 . 主要思路 : 前端登录聊天室,聊天室信息包含用户的登录信息,相当于一个登录功能,会把这个信 ...
- 向导中的参数传递 wizard param
1.在向导页中使用WizardPage.this.getNextPage()方法可以获取到下一页的向导页: 2.在向导wizard中addPages()方法初始化的时候把整个页面传进去. 例:Wiza ...
- 2019HDU多校第三场F Fansblog——威尔逊定理&&素数密度
题意 给定一个整数 $P$($10^9 \leq p\leq 1^{14}$),设其前一个质数为 $Q$,求 $Q! \ \% P$. 分析 暴力...说不定好的板子能过. 根据威尔逊定理,如果 $ ...
- BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...
- 008_linuxC++之_类的静态变量和静态函数
(一)看程序 #include <iostream> #include <string.h> #include <unistd.h> using namespace ...
- React项目性能优化
1. 使用生产版本和Fragment 1. 生产版本 确保发布的代码是生产模式下(压缩)打包的代码. 一般运行npm run build命令. 直接从webpack看配置文件,需要设置mode = ' ...
- Activiti服务类- IdentityService服务类
转自:https://www.cnblogs.com/liuqing576598117/p/9815013.html 一.内置用户组(角色)设计表概念 用户和组(或者叫做角色),多对多关联,通过关联表 ...
- HTML5 本地数据库(SQLite) 示例
http://supercharles888.blog.51cto.com/609344/856071 http://www.sqlite.org/download.html
- python 改变函数实参的值
def change(n): n[] = 'Mr Gumby' names = ['Mrs Entity', 'Mrs. Thing'] change(names) print(names) resu ...
- windows环境下启动mongodb服务
方法一1.打开命令窗口,切换到mongodb安装目录下的“bin”目录中. 输入命令:cd E:\software\MongoDB\Server\3.4\bin 2.启动服务.输入命令:”mongod ...