为啥我的Python这么慢 - 项查找 (二)
2017-11-17 15:38
316 查看
欢迎关注微信号生信宝典:https://mp.weixin.qq.com/s/-0UTgmdRQbF7I4fib62ooA
上一篇为啥我的Python这么慢, 字符串的加和和join被陈群主分享到
根据那篇文章改了两处写法,如下 (存储于readFaJoin2.py文件中):
比之前提速接近
字典本身还有更多高效用法,可以去参考知乎的那篇文章。这儿介绍的是妙用字典的哈希属性快速查找项。
在生信操作中,常常会在一个大矩阵中匹配已小部分基因或位点,提取关注的基因或位点的信息。最开始的写法是:
后来,随着数据量变大,发现这个速度并不快,于是换了下面的方式
又可以愉快的查询了。
为什么呢?
这是因为:在
字典的查询复杂度为什么是
后来发现
那么速度到底差多大,有没有直观一些的展示呢? 这是StackOverflow的一个简化例子, 百万倍速度差异。
10 loops, best of 3:
10000000 loops, best of 3:
10000000 loops, best of 3:
Ref:
速度测试例子 https://stackoverflow.com/questions/513882/python-list-vs-dict-for-look-up-table
python各数据结构时间复杂度 https://wiki.python.org/moin/TimeComplexity
上一篇为啥我的Python这么慢, 字符串的加和和join被陈群主分享到
biopython-生信QQ群时,乐平指出字典的写法存在问题,并给了一篇知乎的链接https://zhuanlan.zhihu.com/p/28738634指导如何高效字典操作。
根据那篇文章改了两处写法,如下 (存储于readFaJoin2.py文件中):
from collections import defaultdict aDict = 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.py real 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 msecper loop
ct@ehbio:~$ python -mtimeit -s 'd=dict.fromkeys(range(10**7))' '5*10**6 in d'
10000000 loops, best of 3:
0.16 usecper loop
ct@ehbio:~$ python -mtimeit -s 'd=set(range(10**7))' '5*10**6 in d'
10000000 loops, best of 3:
0.164 usecper 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这么慢 (一)
- Python为啥这么火
- Python多线程问题的资料查找与汇总by tsy
- ubuntu查找python包的位置
- Python二分查找详解
- python 多线程查找进程pid
- 查找数组的最小的前几个数的值 (python)(解法2)
- python文档字符串查找应用---find()
- python实现查找c cpp的文件[原创]
- python学习笔记-使用re模板在字符串中查找所有单词
- python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
- python实现在目录中查找指定文件的方法
- Python数据结构之二叉树(涵盖了构建、删除、查找、字典转换、非递归与递归遍历等)
- python numpy元素的区间查找方法
- python和pywin32实现窗口查找、遍历和点击
- python查找目录下指定扩展名的文件实例
- Python一日一练16----折半查找
- python 多线程就这么简单
- python 正则表达式 字符串的 匹配 替换 分割 查找
- Python实现的根据文件名查找数据文件功能示例