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


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

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

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

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


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

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


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

    第一段:

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

    第二段:

    if(pos in fre_dist):
    newValue=fre_dist[pos]
    
    • 1
    • 2

    在处理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 "", 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}
    #结果也是对的
    >>>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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

    所以,我的建议是:遍历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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们可以看出,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    range合并:

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

    尾语

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

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

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

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

  • 相关阅读:
    【rainbowzhou 面试9/101】技术提问--常见的大数据基准测试工具有哪些未命名文章
    COSCon'23 闪电演讲报名须知
    phoenix安装
    基于SqlSugar的开发框架循序渐进介绍(26)-- 实现本地上传、FTP上传、阿里云OSS上传三者合一处理
    今天遇到Windows 10里安装的Ubuntu(WSL)的缺点
    C++ Reference: Standard C++ Library reference: C Library: cmath: nearbyint
    Vue组件小tips
    LeetCode 1704. 判断字符串的两半是否相似
    Pandas数据分析31——全国城市房价分析及样式可视化
    Zookeeper集群 + Kafka集群
  • 原文地址:https://blog.csdn.net/m0_72282564/article/details/134012630