Pytables对查询非匹配字符串的速度很慢

时间:2014-08-19 14:33:41

标签: python pytables

我在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

任何能指出正确方向的建议都将不胜感激!

1 个答案:

答案 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