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


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

    最近在进行基因组数据处理的时候,需要读取较大数据(2.7G)存入字典中,然后对被处理数据进行字典key值的匹配,在被处理文件中每次读取一行进行处理后查找是否在字典的keys中,以下两段代码的效率差别非常大:

    第一段:

    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 的方法,确实这个方法在大多数情况下都是适用的。但是并不是完全安全,请看下面这个例子:

    复制代码代码如下:
    #这里初始化一个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遍历中带括号与不带括号的性能问题

    复制代码代码如下:

    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():就是依次取出每一个数组的元素,然后组合

    复制代码
    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);
  • 相关阅读:
    kubernetes入门之kube-proxy实现原理
    kubernetes源码阅读及编译
    docker的网络-Container network interface(CNI)与Container network model(CNM)
    kubernetes入门之skydns
    浅析flannel与docker结合的机制和原理
    kubernetes入门之快速部署
    python并发获取snmp信息及性能测试
    Facebook开源的基于SQL的操作系统检测和监控框架:osquery daemon详解
    Facebook开源的基于SQL的操作系统检测和监控框架:osquery Table详解
    视频工具类产品是个什么玩意,产品经理怎么构思一款视频工具类产品
  • 原文地址:https://www.cnblogs.com/timssd/p/8905268.html
Copyright © 2020-2023  润新知