python读取大文件越来越慢的原因与解决
作者:hank-yan 发布时间:2022-07-23 08:35:28
背景:
今天同事写代码,用python读取一个四五百兆的文件,然后做一串逻辑上很直观的处理。结果处理了一天还没有出来结果。问题出在哪里呢?
解决:
1. 同事打印了在不同时间点的时间,在需要的地方插入如下代码:
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
发现一个规律,执行速度到后面时间越来越长,也就是处理速度越来越慢。
2. 为什么会越来越慢呢?
1)可能原因1,GC 的问题,有篇文章里面写,python list append 的时候会越来越慢,解决方案是禁止GC:
使用 gc.disable()和gc.enable()
2)改完上面,仍然不行,然后看到一篇文章里面写,可能是因为 git 导致的,因为append 的时候 git 会不断同步,会出问题,于是删除 .git 文件夹,结果还是不行。
3)继续查询,发下一个及其有可能出问题的地方。dict 的 in dict.key(),判断 key 是否在 dict 里面,这个的效率是非常低的。看到一篇文章比较了效率:
① 使用 in dict.keys() 效率:
② 使用 has_key() 效率:
发现 has_key() 效率比较稳定。于是修改,问题解决。
后话:
最初的时候,的确是使用 has_key(), 结果后面上传代码的时候,公司代码检查过不了,提示不能使用这个函数,只能改成 in dict.key() 这种方式,为什么公司不让这么传呢?经过一番百度,发现原因所在:在 python3 中,直接将 has_key() 函数给删除了,所以禁止使用。那禁止了该怎么办呢?原来 python 中 in 很智能,能自动判断 key 是否在字典中存在。所以最正规的做法不是 has_key(), 更不是 in dict.keys(), 而是 in dict. 判断 key 在 map 中,千万别用 in dict.keys() !!!
附录:
in、 in dict.keys()、 has_key() 方法实战对比:
>>> a = {'name':"tom", 'age':10, 'Tel':110}
>>> a
{'age': 10, 'Tel': 110, 'name': 'tom'}
>>> print 'age' in a
True
>>> print 'age' in a.keys()
True
>>>
>>> print a.has_key("age")
True
总结
参考资料:
https://www.douban.com/group/topic/44472300/
http://www.it1352.com/225441.html
https://www.jb51.net/article/145424.htm
来源:https://www.cnblogs.com/hank-yan/p/8660162.html


猜你喜欢
- ps:大多与c等编程语言极为相似一、if分支if:给定一个条件,同时为该条件设置多种(一般两种)情况,然后通过条件判断来实现具体的执行段复合
- 先来看看绘制的动态水球图:没有安装PyEcharts的,先安装PyEcharts:# 安装pyecharts模块,直接安装就是最新的版本pi
- 实际使用Pool 是用于存放临时对象的集合,这些对象是为了后续的使用,以达到复用对象的效果。其目的是缓解频繁创建对象造成的gc压力。在许多开
- python寻找主串中所有指定子串下标该函数可实现显示字符串中指定子串所有下标(首字下标)def subStrIndex(substr,st
- 为了测试一组网页是否能够访问,采取python中的requests包进行批量的访问测试,并输出访问结果。一、requests包的安装 打开命
- 前言:最近在学习PYQT5,感觉还挺有趣的,顺便记录一下自己的打包记录,也就当学习笔记啦,如果刚好也在学习python打包的小伙伴可以学一学
- 安装jenkins安装jenkins很简单,可以用多种方式安装,这里知道的有:在官网下载rpm包,手动安装,最费事centos系统通过yum
- 本文为大家分享了WebStorm安装教程,供大家参考一、简介WebStorm 是jetbrains公司旗下一款JavaScript 开发工具
- 本文实例讲述了python简单实现基于SSL的 IRC bot。分享给大家供大家参考。具体如下:#!/usr/bin/python# -*-
- 1:文件内容格式为json的数据如何解析import json,os,syscurrent_dir=os.path.abspath(&quo
- 1 减少HTTP请求数量 (Minimize HTTP Requests) tag:content80%的用户响应时间被花费在前端
- PyTorch上的常用数据类型如下Data typedtypeCPU tensorGPU tensorSize/bytes32-bit fl
- 背景:pytest以特定规则搜索测试用例,所以测试用例文件、测试类以及类中的方法、测试函数这些命名都必须符合规则,才能被pytest搜索到并
- 目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了。首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己
- 题目输入一个正整数数组,把数组里面的所有属猪拼接起来成为一个数打印能拼接起来的所有数字中最大/最小的那个。思考直观想法就是求出这个数组中所有
- 本文实例讲述了PHP实现数组根据某个字段进行水平合并,横向合并。分享给大家供大家参考,具体如下:PHP数组水平合并,横向合并,两条数据合并成
- 在JavaScript的世界里,定义函数的方法多种多样,这正是JavaScript灵活性的体现,但是正是这个原因让初学者摸不着头脑,尤其对于
- 我就废话不多说了,大家还是直接看代码吧~type Animal struct { ID int64 Name string `gorm:&q
- eval()函数eval() 函数用来执行一个字符串表达式,并返回表达式的值。语法eval(expression[, globals[, l
- 本文的重点就是如何创建一个PHP类来实现两个数间的加减乘除,这种类似于极简单的计算器功能。实现起来是非常简单的,继续往下看:这里简单给大家介