私はPython GithubリポジトリからPython 3.6 alphaビルドをダウンロードしました。私の好きな新機能の1つはリテラル文字列の書式設定です。それはそうと同じように使用することができます。なぜPython 3.6アルファでリテラルフォーマットの文字列が遅いのですか? (現在stable 3.6で修正されています)
>>> x = 2
>>> f"x is {x}"
"x is 2"
これはstr
インスタンス上format
機能を使用するのと同じことを行うように見えます。しかし、私が気づいたことの1つは、このリテラル文字列の書式設定は、実際にはformat
を呼び出すのに比べて非常に遅いということです。ここでtimeit
は、それぞれの方法について述べているものです:
>>> x = 2
>>> timeit.timeit(lambda: f"X is {x}")
0.8658502227130764
>>> timeit.timeit(lambda: "X is {}".format(x))
0.5500578542015617
私はtimeit
の引数として文字列を使用している場合は、私の結果はまだパターンを示している。
>>> timeit.timeit('x = 2; f"X is {x}"')
0.5786435347381484
>>> timeit.timeit('x = 2; "X is {}".format(x)')
0.4145195760771685
あなたが見ることができるように、format
を使用することはほとんど取ります半分の時間。文法が少ないので、リテラルメソッドが高速になると思います。リテラルメソッドが非常に遅くなるシーンの裏には何が起こっていますか?
f-stringsは動的なので、すべてのループで文字列を生成する必要があります。書式文字列は、コードが実行される前に作成されたリテラルで、バイトコードに変換されます。 –
@AlexHallこれは、 'x'が' format'メソッドに渡されたときローカル変数に代入されますが、 'globals'では' f "によって見つけ出さなければならないかもしれません..."構文。 – schwobaseggl
@AlexHall:これはバグではありません。 'str.format()'は* runtime *のスロットを解析するのに対し、コンパイル時にはフォーマット文字列を解析する必要があるため、実装が異なるだけです。 –