0

1 と 0 で構成される着信文字列があります。少しずつ構築されています。この末尾は、ある時点で 1001 と 0101 の 2 つのパターンのいずれかに一致し、一致すると検索を終了します (これは 1 回の繰り返しであり、パターンは繰り返しごとに異なります)。

いずれかのパターンをテストしてから、どのパターンが文字列を終了したかを記録し、この反復を行いたいと考えています。次に、着信文字列に対して、さまざまなパターンでプロセスを繰り返す必要があります。

私はこれをコード化しましたが、それは醜い私見です.Pythonでこれを行うためのはるかにエレガントで効率的な方法があると確信しています(私は本当に初心者です)。現時点で私がそれを行う方法は次のようなものです:

pattern1 = getPattern1()
pattern2 = getPattern2()


while 1:

    s += nextBit()

    if s.count(pattern1) and s.count(pattern2): 

        if s.find(pattern1) < s.find(pattern2):
            tot1 += 1
        else:
            tot2 += 1

        s = ''

     ...
4

1 に答える 1

0

最初に、正確で意図を明確に表現する読み取り可能なコードを記述し、次にパフォーマンスを測定し、必要に応じて最適化します。

正規表現を使用して、パターンの検索と抽出を同時に行うことができます。

import re

# match any of the patterns literally at the end of string
regex = re.compile(r"(?:%s)$" % "|".join(map(re.escape, patterns)))
def getpattern(s):
    m = regex.search(s)
    return m and m.group()

maxlen = max(map(len, patterns))
count = dict.fromkeys(patterns, 0)
s = ""
for bit in iter(nextBit, ""): # get bits until empty string
    s += bit
    p = getpattern(s)
    if p: # found pattern
       count[p] += 1
       s = ""
    elif len(s) > maxlen: # limit s size
       s = s[-maxlen:]
print(count)

入力でパターンがまれな場合は、.endswith(patterns)ベースのソリューションがより効率的である可能性があります。

速度を上げるには、一度に複数のビットを読み取り、より大きなバッファーでパターンをカウントすることを検討してください。

于 2013-02-02T11:02:22.320 に答える