我在python中比较新,我使用pytables在hdf中存储一些基因组注释以便更快地查询。我发现在表格中查询不匹配的字符串很慢,但我不确定如何优化它以获得更好的性能。
下面显示的是其中一个表格:
In [5]: t
Out[5]:
/gene/annotation (Table(315202,), fletcher32, blosc(5)) ''
description := {
"name": StringCol(itemsize=36, shape=(), dflt='', pos=0),
"track": StringCol(itemsize=12, shape=(), dflt='', pos=1),
"etype": StringCol(itemsize=12, shape=(), dflt='', pos=2),
"event": StringCol(itemsize=36, shape=(), dflt='', pos=3)}
byteorder := 'irrelevant'
chunkshape := (1365,)
autoindex := True
colindexes := {
"name": Index(9, full, shuffle, zlib(1)).is_csi=True}
当条件与表中的某些内容匹配时,timeit将以微秒为单位返回。
In [6]: timeit [x for x in t.where("name == 'record_exists_in_table'")]
10000 loops, best of 3: 109 µs per loop
但是,当我尝试搜索不存在的字符串时,它是在几毫秒内。
In [8]: timeit [x for x in t.where("name == 'no_such_record'")]
10 loops, best of 3: 56 ms per loop
任何能指出正确方向的建议都将不胜感激!
答案 0 :(得分:0)
我已经用尽了我在网上的搜索功能,却找不到解决问题的方法。所以我决定在biopython中使用SeqIO.index_db()
创建一个单独的索引,然后检查以确保在执行pytable查询之前找到条件。不完全是我正在寻找的漂亮解决方案,但这样做。它在非匹配条件下大大提高了性能。
In [6]: timeit [x for x in t.where("name == 'not_found_in_table'")]
10 loops, best of 3: 51.6 ms per loop
In [9]: timeit [x for x in t.search_by_gene('not_found_in_table')]
10000 loops, best of 3: 29.5 µs per loop