1

ネストされたリストをフラット化する必要がありました。flatten 関数を書いた後、自然にそれを壊す方法がいくつあるかを試してみました。最終的に pypy で実行したところ、リストが非常に深くなると、pypy が cpython よりも大幅に高速に実行されていることがわかりました。

しかし、私は、より大きく、より複雑なリストを使用したテストが、より多くの要素を含む、「単純な」リストよりも実際に高速に実行されるという奇妙な状況を見ています。

要素数が少ないテスト 1 は、テスト 2 よりも (time pypy ./script.py を使用して) 実行するのに一貫して約 1 秒遅くなります。

def flatten(lol):
    if not any([isinstance(i, list) for i in lol]):
        return lol

    flatter = [i for i in lol if not isinstance(i, list)]
    for sublist in lol:
        if isinstance(sublist, list):
            flatter.extend(sublist)
    return flatten(flatter)

def silly(l):
    return [l, [l]]

nested_function = [["kaplutis", ["mucus", ["my brain", ["is","filled",["with",["pus",]]]]]], "santa gertrudis",[[[[["innermost",flatten(["in", "func"])]]]]]]

tuples = ["empty tuple retained-->", (), ("2-tuple not flattened",), ("I'm the only thing in this tuple")]

dicts = [{"hip": "hop", "ster": "toad"}]

lone_dict = {"lone": 1, "dict": 2}

silly_list = ["1"]
for i in range(20):
    silly_list = silly(silly_list)

# test 1 - only the absurdly nested list
print(len(flatten(silly_list)))

# test 2 - absurdly nested list, with 
lol = [nested_function, tuples, dicts, lone_dict, silly_list]
print(len(flatten(lol)))

私が把握できる唯一のことは、2 番目のテストで "silly_list" の前に JIT が単純なネストされたリストを処理しているときに、偶発的な最適化に遭遇したことです。

4

2 に答える 2

1

この特定の flatten 関数は、cpython と pypy でさまざまな悪いパフォーマンス ポイントにヒットしました

しばらく前に irc でそれを考え出しましたが、修正は、cpython でより高速で、pypy ではるかに高速な、まったく異なる flatten 関数を作成することでした。

URLを覚えていません。OPが提供してくれるといいですね

基本的なコードは次の行に沿っていました

def flatten(items, akk=None)
 if akk is None:
   akk  = []
 for item in items:
   if isinstance(item, list):
     flatten(item, akk)
   else:
     akk.append(item)
于 2012-08-24T08:07:33.637 に答える
0

コードを含めるためのコメントの代わりに回答

あなたのコードが何をするのか理解するのは難しいです。正しいことを確認してください。後で最適化します。以下に対して結果をテストできます。

def flatten(lst, nonscalar_types=list):
    for x in lst:
        if isinstance(x, nonscalar_types):
            yield from flatten(x) # pep 380
        else:
            yield x # non-list type

print(sum(1 for _ in flatten(lol)))
于 2012-06-20T20:17:39.733 に答える