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

最近在进行基因组数据处理的时候,需要读取较大数据(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 "", line 1, in

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值