当前位置: 首页 > news >正文

python 字典dict和列表list的读取速度问题, range合并

嗨喽,大家好呀~这里是爱看美女的茜茜呐

python 字典和列表的读取速度问题

最近在进行基因组数据处理的时候,需要读取较大数据(2.7G)存入字典中,

然后对被处理数据进行字典key值的匹配,在被处理文件中每次读取一行进行处理后查找是否在字典的keys中,


👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


以下两段代码的效率差别非常大:

第一段:

if(pos in fre_dist.keys()):
newvalue= fre_dist[pos]

第二段:

if(pos in fre_dist):
newValue=fre_dist[pos]

在处理3万条数据时,第二段代码的速度是第一段代码速度的上千倍。

原因是:第一段代码 fre_dist.keys()变成了list,python在检索list的时候是比较慢的,第二段代码 fre_dist是字典,python在检索字典的时候速度是比较快的。

dict结构,我想大多数人都会想到for key in dictobj的方法,确实这个方法在大多数情况下都是适用的。

但是并不是完全安全,请看下面这个例子:

代码如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#这里初始化一个dict
>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#本意是遍历dict,发现元素的值是0的话,就删掉
>>> for k in d:
...   if d[k] == 0:
...     del(d[k])
... 
Traceback (most recent call last):File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
#结果抛出异常了,两个0的元素,也只删掉一个。
>>> d
{'a': 1, 'c': 1, 'd': 0}>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#d.keys() 是一个下标的数组
>>> d.keys()
['a', 'c', 'b', 'd']
#这样遍历,就没问题了,因为其实其实这里遍历的是d.keys()这个list常量。
>>> for k in d.keys():
...   if d[k] == 0:
...     del(d[k])
... 
>>> d
{'a': 1, 'c': 1}
#结果也是对的
>>>

其实,这个例子是我简化过的,我是在一个多线程的程序里发现这个问题的,

所以,我的建议是:遍历dict的时候,养成使用 for k in d.keys() 的习惯

不过,如果是多线程的话,这样就绝对安全吗?

也不见得:当两个线程都取完d.keys()以后,如果两个线程都去删同一个key的话,先删的会成功,后删的那个肯定会报 KeyError ,这个看来只能通过其他方式来保证了。

dict 两种遍历方式的性能对比

关于纠结dict遍历中带括号与不带括号的性能问题

代码如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for (d,x) in dict.items():print "key:"+d+",value:"+str(x)for d,x in dict.items():print "key:"+d+",value:"+str(x)

我们可以看出,dict条数在200一下的时候是带括号的性能比较高一点,但是在200条以上的数据后不带括号的执行时间会少些.

字典用花括号({})表示,里面的项成对出现,一个 key 对应一个 value;key 与 value

之间用冒号(:)分隔;不同的项之间用逗号(,)分隔。

Python Shell:

n = {'username':'zz',"password":123}
n.keys()
dict_keys(['username', 'password'])
n.values()
dict_keys(['zz', 123])n.items()
dict_items([('username', 'zc'), ('password', 123)])for (k,v) in n.items():print("this's key:%r" %k)print("this's value:%r" %v")this's key:'username'
this's value:'zc'
this's key:'password'
this's value:123

zip():就是依次取出每一个数组的元素,然后组合

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:261823976
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
n = [1,2,3]
m = ['a','b','c']
a = zip(m,n)for i in a:print(i)('a', 1)
('b', 2)
('c', 3)
n = [1,2,3]
m = ['a','b','c']
a = zip(m,n)for (m,n) in a:print(m,n)a 1
b 2
c 3

range合并:

for i in range(48,58)+range(65,91):c8=chr(i);

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

http://www.lryc.cn/news/207305.html

相关文章:

  • 测试用例的设计方法(全):等价类划分方法
  • Office技巧(持续更新)(Word、Excel、PPT、PowerPoint、连续引用、标题、模板、论文)
  • Java实现ORM第一个api-FindAll
  • HFSS笔记——求解器和求解分析
  • jenkins配置gitlab凭据
  • 0基础学习PyFlink——用户自定义函数之UDTF
  • 【Java 进阶篇】Java Request 原理详解
  • 13 结构性模式-装饰器模式
  • 支持向量机(SVM)
  • Rabbitmq----分布式场景下的应用
  • springboot + redis实现签到与统计功能
  • Redis | 数据结构(02)SDS
  • Linux C语言开发-D7D8运算符
  • redis 配置主从复制,哨兵模式案例
  • Python---练习:使用for循环实现用户名+密码认证
  • react中使用jquery 语法
  • 服务器中了360后缀勒索病毒怎么解决,勒索病毒解密,数据恢复
  • 使用字节流读取文件中的数据的几种方式
  • Android WMS——概述(一)
  • Node编写获取用户信息接口
  • 【从0到1设计一个网关】自研网关的设计要点以及架构设计
  • 论文-分布式-分布式计算|容错-分布式控制下的自稳定系统
  • C#压缩图片的方法
  • 安装 fcitx + 搜狗/谷歌输入法 之后导致 死机,重启后黑屏只有鼠标可以移动
  • Maven项目转为SpringBoot项目
  • C语言之预处理
  • css步骤条
  • [Hive] 常见函数
  • Mac用NTFS文件夹读写NTFS硬盘 NTFS能复制多大的文件
  • 【unity3D】Scroll Rect组件—制作下滑列表