1

私はPythonで次のステートメントを持っています、ここでoriは文字列です

[ori [ori.rfind('')+ 1:]、ori [:ori.rfind('')]]

ori.rfind('')が2回呼び出されていることがわかりますが、インタプリタは関数を1回だけ評価するのに十分賢いですか?

次のことができます。

    s = ori.rfind('')
    return [ori [s + 1:]、ori [:s]]

しかし、これは2行を使用します。このステートメントを文字列のリストのリスト内包表記で使用するつもりであり、この関数が1行であることを願っています。

この場合、文字列は不変であるため、インタプリタは実際に理解しやすくなります。私の推測では、おそらく通訳は再評価を避けるために賢いことができます。一般に、オブジェクトが不変である場合、インタプリタは十分に賢くなりますか?

4

2 に答える 2

5

インタープリターが関数を一度だけ評価することを期待できるとは思いませんが、これは現在のコードに相当する代替手段であり、2行の方法よりも短く効率が似ています。

ori.rsplit(' ', 1)[::-1]

例とタイミングの比較:

In [1]: ori = 'foo bar baz'

In [2]: [ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
Out[2]: ['baz', 'foo bar']

In [3]: ori.rsplit(' ', 1)[::-1]
Out[3]: ['baz', 'foo bar']

In [4]: %timeit [ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
1000000 loops, best of 3: 732 ns per loop

In [5]: %timeit ori.rsplit(' ', 1)[::-1]
1000000 loops, best of 3: 514 ns per loop

In [6]: %timeit s = ori.rfind(' '); [ori[s+1:], ori[:s]]
1000000 loops, best of 3: 490 ns per loop
于 2013-03-15T17:31:27.907 に答える
2

インタプリタが部分式を安全にori.rfind(' ')一度実行できる唯一の方法は、それが次のことを知っている場合です。

  1. rFind式はミューテーションを実行しませんでした
  2. rFindの最初の使用と2回目の使用の間に突然変異を引き起こした発現はありません

これのいずれかが当てはまらない場合、結果をキャッシュして再利用することは単に安全ではありません。Pythonの動的な性質を考えると、これらの保証を得るのはほぼ不可能であるため、このような操作をキャッシュして再利用することはできませんでした

于 2013-03-15T17:34:54.950 に答える