1

部分文字列のインスタンスがより大きな文字列に存在するかどうかを判断するとき、

次の 2 つのオプションを検討しています。

(1)

if "aaaa" in "bbbaaaaaabbb":
    dosomething()

(2)

pattern = re.compile("aaaa")
if pattern.search("bbbaaaaaabbb"):
    dosomething()

2 つのうちどちらがより効率的で高速ですか (文字列のサイズが巨大であることを考えると)??

より高速な他のオプションはありますか??

ありがとう

4

3 に答える 3

5

正規表現は遅くなります。

$ python -m timeit '"aaaa" in "bbbaaaaaabbb"'
10000000 loops, best of 3: 0.0767 usec per loop
$ python -m timeit -s 'import re; pattern = re.compile("aaaa")' 'pattern.search("bbbaaaaaabbb")'
1000000 loops, best of 3: 0.356 usec per loop
于 2013-11-11T16:46:38.433 に答える
4

オプション(1)は間違いなく高速です。将来のために、次のようにしてテストします。

>>> import time, re
>>> if True:
...     s = time.time()
...     "aaaa" in "bbbaaaaaabbb"
...     print time.time()-s
... 
True
1.78813934326e-05

>>> if True:
...     s = time.time()
...     pattern = re.compile("aaaa")
...     pattern.search("bbbaaaaaabbb")
...     print time.time()-s
... 
<_sre.SRE_Match object at 0xb74a91e0>
0.0143280029297

これを行う gnibbler の方法の方が優れています。私は実際にインタープリター オプションをいじったことがないので、それについては知りませんでした。

于 2013-11-11T16:47:01.677 に答える
1

たまたま大腸菌のゲノムが手元にあるので、2 つのオプションをテストしました... 大腸菌のゲノムで「AAAA」を 10,000,000 回 (まともな回数を得るために) 検索 (1) すると、約 3.7 秒かかります. オプション (2) では、もちろん pattern = re.compile("AAAA") をループから外して、約 8.4 秒かかりました。私の場合の「dosomething()」は、任意の変数に 1 を追加していました。私が使用した大腸菌ゲノムは、4639675 ヌクレオチド (文字) の長さです。

于 2013-11-11T17:03:39.687 に答える