欢迎关注微信号生信宝典: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)

后来发现pythonset也是用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这么慢 - 项查找 (二)相关推荐

  1. 在ArcMap中制作Python加载项线连接工具

    学习Python加载项可以参考: 使用python制作ArcGIS插件(1)工具介绍 使用python制作ArcGIS插件(2)代码编写 使用python制作ArcGIS插件(3)ArcPy的使用说明 ...

  2. python使用heapq快速查找最大或最小的 N 个元素

    python使用heapq快速查找最大或最小的 N 个元素 heapq实现了一个适合与Python的列表一起使用的最小堆排序算法. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆.( heapq ...

  3. Python将新项添加到字典[重复]

    本文翻译自:Python add new item to dictionary [duplicate] This question already has an answer here: 这个问题在这 ...

  4. python加载项向导_什么是 Python 加载项?

    加载项是一种自定义项,它可以插入到 ArcGIS for Desktop 应用程序(即 ArcMap.ArcCatalog.ArcGlobe 和 ArcScene)中以便提供补充功能以完成自定义任务, ...

  5. python找与7相关的数字_C++和python实现阿姆斯特朗数字查找实例代码

    1.题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数. 例如1^3 + 5^3 + 3^3 = 153. 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, ...

  6. Python使用超高效算法查找所有类似123-45-67+89=100的组合

    问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式. 昨天发了一个暴力测试的方法来解决问题,详见Python查找所有类似于123-4 ...

  7. python多继承顺序及分配,python多继承的查找顺序是什么?

    1.查找顺序 (1)本地优先,自己定义或重写的方法优先.本地没有的,按照继承列表,从左往右查找: (2)单调性,所有子类,也要满足查找顺序.也就是说 A 继承 B C,A 会先找 B 再找 C.但是在 ...

  8. jffs2的目录项查找过程

    jffs2的目录项查找调用的函数是jffs2_lookup,下面一起看一下这个函数. /* We keep the dirent list sorted in increasing order of ...

  9. python 二项分布_Python-二项式分布

    python 二项分布 Python-二项式分布 (Python - Binomial Distribution) The binomial distribution model deals with ...

最新文章

  1. SQL获取某个时间段的数据
  2. Python简单主机批量管理工具
  3. 今天又听了蓝色的缘分
  4. 计算机的网络操作题,计算机网络操作题
  5. 二.java下使用RabbitMQ实现hello world
  6. 西南民族大学计算机考试试题,西南民族大学预科教育学院 2007级《计算机》模拟试题(含答案)...
  7. OK335xS psplash Screen 移植
  8. 基于级联双向胶囊网络的鲁棒三元组知识抽取
  9. autoit选中图标无反应_ps图标教学,使用小技巧。
  10. 人工神经网络理论及应用,人工智能神经网络论文
  11. 数据探索(数据特征分析)④—Python分布分析、对比分析、统计量分析、期性分析、贡献度分析、相关性分析
  12. 登链钱包(一款功能强大的以太坊钱包)完全开源
  13. Win10怎么给共享文件夹设密码
  14. 【python】录音语音识别
  15. of介词短语作定语_of介词短语作表语
  16. Linux定时运行Python脚本
  17. AI云边端协同EasyCVR使用海康SDK接入,设备录像下载失败是什么原因?
  18. 大学物理---统计物理(热学部分)
  19. Win10获得system(即超级管理员)权限
  20. 对抗攻击与防御 (1):图像领域的对抗样本生成

热门文章

  1. 【计算机科学基础】控制复杂性的艺术
  2. FirstStep(洛谷P3654题题解,Java语言描述)
  3. vscode 构建Python ,和C++ 开发环境
  4. Django的分页器(paginator)
  5. Scilab 求解线性方程组示例(linsolve)
  6. Java用freemarker导出word
  7. 兔子--百度地图所需的jar+so下载地址
  8. 笔记10:时时屏幕抓取小程序
  9. Nuclide 早起用户体感
  10. 在C#中实现托盘是多么简单