python - 运行多处理 kmer 计数脚本时遇到问题
问题描述
您好,我想在基因组中查找单词/kmers/ngram。我正好有 198000 个文件,每个文件都包含一个长度为 N 的基因组。我有一些代码,例如:
def count_kmers(sequence, alphabet, k, base_filter=False):
seq, alphabet = sequence.upper(), set(alphabet.upper())
seq_len = len(seq)
count = Counter(seq[i:i+k] for i in range(0, seq_len - k +1))
if base_filter:
return dict((key,value) for key, value in
count.items() if set(key).issubset(alphabet))
return count
def kmer_positions(sequence, alphabet, k):
""" returns the position of all k-mers in sequence as a dictionary"""
mer_position = defaultdict(list)
for i in range(1,len(sequence) - k + 1):
kmer = sequence[i:i+k]
if all(base in set(alphabet) for base in kmer):
mer_position[kmer] = mer_position.get(kmer,[]) + [i]
# combine kmers with their reverse complements
pair_position = defaultdict(list)
for kmer, pos in mer_position.items():
krev = get_reverse_complement(kmer)
if kmer < krev:
pair_position[kmer] = sorted(pos + mer_position.get(krev, []))
elif krev < kmer:
pair_position[krev] = sorted(mer_position.get(krev, []) + pos)
else:
pair_position[kmer] = pos
return pair_position
还有其他,但 kmer_positions(sequence, alphabet, k) 函数至少需要 2 分 42 秒才能完成一个长度为 6407042 的基因组。我尝试了多处理的 count_kmers,它从 1.3 秒到 97.3 微秒。
我正在使用这样的多处理:
args = [alphabet='ACGT', k=6]
f = partial(kmer_positions, genome)
pool = multiprocessing.Pool(4)
r = pool.apply_async(f, args) # use apply_async that was the one who works to my arguments
r.get().keys()
我试图找到一个好的材料来学习,但仍然不满意。有什么帮助可以更好地使用这个工具吗?
谢谢 PS - 我知道有很多专门用于此任务的工具,如 khmer、kat 等……但我正在学习 python,我想尽可能地学习这门语言
解决方案
推荐阅读
- jquery - jQuery - 实时更新长度,而不是仅在页面加载时
- wordpress - Wordpress 主题版权编辑(页脚)
- tfs - TFS 开发运维。找不到外部项目文件
- android - 一个文本视图,字符串最多再换行
- php - Amazon Connect 从 Lambda 函数和 PHP 接收 JSON 数据
- ios - 此 ActionScript 函数的 Swift 等效项
- c - getchar() 尝试扫描输入时跳过第一个字符
- objective-c - Mojave/macOS 10.14.0:[AVPlayerItem 持续时间] 始终是不确定的
- rest - 如何使用 Golang 实现导入数据功能?
- redis - 如何使用 JEDISCLUSTER 客户端搜索 Redis 中的键空间?