为啥我的Python这么慢 - 项查找 (二)
欢迎关注微信号生信宝典:https://mp.weixin.qq.com/s/-0UTgmdRQbF7I4fib62ooA
上一篇为啥我的Python这么慢, 字符串的加和和join被陈群主分享到biopython-生信
QQ群时,乐平指出字典的写法存在问题,并给了一篇知乎的链接https://zhuanlan.zhihu.com/p/28738634指导如何高效字典操作。
根据那篇文章改了两处写法,如下 (存储于readFaJoin2.py文件中):
from collections import defaultdictaDict = defaultdict(list)for line in open("GRCh38.fa"):if line[0] == '>':key = line[1:-1]else:aDict[key].append(line.strip())
#----------------------------------------
for key, value in aDict.iteritems():aDict[key] = ''.join(value)
比之前提速接近2s
。一个是使用了defaultdict
初始化字典,另外一个是用iteritems
遍历字典,节省近一半的内存。
time python readFaJoin2.pyreal 0m49.114s
user 0m38.442s
sys 0m10.565s
defaultdict
用在这效果不太明显,之前处理全基因组每个位点数据的频繁存取时,defaultdict
在程序无论速度还是写法上都有很大提升。
字典本身还有更多高效用法,可以去参考知乎的那篇文章。这儿介绍的是妙用字典的哈希属性快速查找项。
在生信操作中,常常会在一个大矩阵中匹配已小部分基因或位点,提取关注的基因或位点的信息。最开始的写法是:
targetL = ['a', 'n', 'c', 'd']
if item in targetL:other_operations
后来,随着数据量变大,发现这个速度并不快,于是换了下面的方式
targetL = ['a', 'n', 'c', 'd']
targetD = dict.fromkeys(targetL, 0)if item in targetD:other_operations
又可以愉快的查询了。
为什么呢?
这是因为:在Pyhton
中列表的查询时间复杂度是O(n)
(n
是列表长度);字典的查询负责度是O(1)
(与字典长度无关)。
字典的查询复杂度为什么是O(1)
呢? Python中实现了一个hash
函数,把字典的key
转换为哈希
值,组成连续地址的数字哈希表
。字典的每次查询转换为了从数组特定位置取出一个元素,所以时间复杂度为O(1)
。
后来发现python
中set
也是用hash table
存储,所以上面的程序,可以更简化而不影响速度。
targetS = set(['a', 'n', 'c', 'd'])if item in targetS:other_operations
那么速度到底差多大,有没有直观一些的展示呢? 这是StackOverflow的一个简化例子, 百万倍速度差异。
ct@ehbio:~$ python -mtimeit -s 'd=range(10**7)' '5*10**6 in d'
10 loops, best of 3: 182 msec
per loop
ct@ehbio:~$ python -mtimeit -s 'd=dict.fromkeys(range(10**7))' '5*10**6 in d'
10000000 loops, best of 3: 0.16 usec
per loop
ct@ehbio:~$ python -mtimeit -s 'd=set(range(10**7))' '5*10**6 in d'
10000000 loops, best of 3: 0.164 usec
per loop
Ref:
- 速度测试例子 https://stackoverflow.com/questions/513882/python-list-vs-dict-for-look-up-table
- python各数据结构时间复杂度 https://wiki.python.org/moin/TimeComplexity
生信宝典 http://mp.weixin.qq.com/s/d1KCETQZ88yaOLGwAtpWYg
生信宝典,生物信息学习系列教程,转录组,宏基因组,外显子组,R作图,Python学习,Cytoscape视频教程
http://mp.weixin.qq.com/s/d1KCETQZ88yaOLGwAtpWYg
生信宝典,最好的生物信息培训课程,培训课程资料
www.ehbio.com/Training
为啥我的Python这么慢 - 项查找 (二)相关推荐
- 在ArcMap中制作Python加载项线连接工具
学习Python加载项可以参考: 使用python制作ArcGIS插件(1)工具介绍 使用python制作ArcGIS插件(2)代码编写 使用python制作ArcGIS插件(3)ArcPy的使用说明 ...
- python使用heapq快速查找最大或最小的 N 个元素
python使用heapq快速查找最大或最小的 N 个元素 heapq实现了一个适合与Python的列表一起使用的最小堆排序算法. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆.( heapq ...
- Python将新项添加到字典[重复]
本文翻译自:Python add new item to dictionary [duplicate] This question already has an answer here: 这个问题在这 ...
- python加载项向导_什么是 Python 加载项?
加载项是一种自定义项,它可以插入到 ArcGIS for Desktop 应用程序(即 ArcMap.ArcCatalog.ArcGlobe 和 ArcScene)中以便提供补充功能以完成自定义任务, ...
- python找与7相关的数字_C++和python实现阿姆斯特朗数字查找实例代码
1.题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数. 例如1^3 + 5^3 + 3^3 = 153. 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, ...
- Python使用超高效算法查找所有类似123-45-67+89=100的组合
问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式. 昨天发了一个暴力测试的方法来解决问题,详见Python查找所有类似于123-4 ...
- python多继承顺序及分配,python多继承的查找顺序是什么?
1.查找顺序 (1)本地优先,自己定义或重写的方法优先.本地没有的,按照继承列表,从左往右查找: (2)单调性,所有子类,也要满足查找顺序.也就是说 A 继承 B C,A 会先找 B 再找 C.但是在 ...
- jffs2的目录项查找过程
jffs2的目录项查找调用的函数是jffs2_lookup,下面一起看一下这个函数. /* We keep the dirent list sorted in increasing order of ...
- python 二项分布_Python-二项式分布
python 二项分布 Python-二项式分布 (Python - Binomial Distribution) The binomial distribution model deals with ...
最新文章
- SQL获取某个时间段的数据
- Python简单主机批量管理工具
- 今天又听了蓝色的缘分
- 计算机的网络操作题,计算机网络操作题
- 二.java下使用RabbitMQ实现hello world
- 西南民族大学计算机考试试题,西南民族大学预科教育学院 2007级《计算机》模拟试题(含答案)...
- OK335xS psplash Screen 移植
- 基于级联双向胶囊网络的鲁棒三元组知识抽取
- autoit选中图标无反应_ps图标教学,使用小技巧。
- 人工神经网络理论及应用,人工智能神经网络论文
- 数据探索(数据特征分析)④—Python分布分析、对比分析、统计量分析、期性分析、贡献度分析、相关性分析
- 登链钱包(一款功能强大的以太坊钱包)完全开源
- Win10怎么给共享文件夹设密码
- 【python】录音语音识别
- of介词短语作定语_of介词短语作表语
- Linux定时运行Python脚本
- AI云边端协同EasyCVR使用海康SDK接入,设备录像下载失败是什么原因?
- 大学物理---统计物理(热学部分)
- Win10获得system(即超级管理员)权限
- 对抗攻击与防御 (1):图像领域的对抗样本生成