ネストされたリストをフラット化する必要がありました。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 が単純なネストされたリストを処理しているときに、偶発的な最適化に遭遇したことです。