1

「ステート マシン」という言葉に言及すると、ほとんどの人はステート マシンの設計に行きます。ですから、要点に焦点を当てるためにケースを単純化したいと思います。

ここで提案されているのはテキスト フローです。非常に長いか、現在の段階に頻繁に持ち込まれます。

シーケンスから 1 文字を処理するたびに、次の状態を決定します。以下に 2 つの解決策を示します。

textflow = iter(text)
endFlag = False
while True:
   process()
   if endFlag:break

プロセスメソッドは次のようになります

def process0():
    for x in textflow:
        do something
        if condition1:
           process = process1
           break
        elif cond2:
           process = process2
           break


def process1():
    for x in textflow:
        do something
        if cond0:
           process = process0
           break
        elif cond2:
           process = process2
           break
    ...

また

for x in text:
   process(x)

プロセスメソッドは次のようになります

def process0(x):
    do something
    if cond1:
      process = process1
    elif cond2:
      process = process2

def process1(x):
    do something
    if cond0:
       process = process0
    elif cond2:
       process = process2
....

最初のソリューションでは、各プロセス メソッドが独自の方法で反復を行い、状態が変更されるまでプロセスを終了します。2 番目の例では、メイン ループが反復を実行し、そのたびにプロセスが呼び出されます (map()使用できますが、プロセスは毎回変更されるため、役に立ちません)。

状態の変化は次のようになります。

0 1 2 1 0 2 1 0 1 2 0 1 2 0 ....

またはこのように:

0 0 0 0 0 ...many 0 .. 0 1 ...many 1 ... 1 2......2 1 ..... 1

より一般的なケースは次のとおりです。

0 1 1 1 1 1 0 0 2 1 1 1 1 2 0 2 3 1 1 1 1 3 1 1 1 2 0 ....

どちらのソリューションがより効率的かを教えてくれるアドバイザーが必要です。

4

1 に答える 1

0

関数呼び出しはコストがかかるため、処理するアイテムの数に大きく依存します。項目数が多い場合は、ループを関数内に埋め込む方が適切なオプションです。いくつかの項目を反復するだけの場合は、通常、意図を最も明確に表現できるものを使用します。

于 2012-08-29T02:43:17.073 に答える