为啥我的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.565sdefaultdict用在這效果不太明顯,之前處理全基因組每個位點數據的頻繁存取時,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这么慢 - 项查找 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音频插件安装教程,Arturia Pro
- 下一篇: Mac如何快速导出保存Pages文档里的