1

使用しないパラメータを常に取得する関数があるとします。

def someFunc(s):
  # do something _not_ using s, for example
  a=1

今、この呼び出しを検討してください

someFunc("the unused string")

これは、実行時に構築されないが、バイナリに直接コンパイルされるパラメータとして文字列を提供します(そうだといいのですが)。

問題は、たとえば、この方法でsomeFuncを数千回呼び出すと、「未使用の文字列」への参照が常に渡されますが、プログラムの速度が低下するのでしょうか。

私の素朴な考えでは、「未使用の文字列」への参照は「定数」であり、someFuncへの呼び出しが発生したときにO(1)で使用可能です。だから私は「いいえ、それはパフォーマンスを損なうことはありません」と言うでしょう。

以前と同じ質問:「私は正しいですか?」

いくつかありがとう:-)

4

2 に答える 2

2

文字列は毎回 (参照によって) 渡されますが、非常にタイトなループでない限り、オーバーヘッドが小さすぎて実際にパフォーマンスに影響を与えることはありません。

于 2010-02-17T13:42:50.157 に答える
1

これは CPython の実装の詳細であり、他の python には当てはまらないかもしれませんが、多くの場合、コンパイルされたモジュールでは定数文字列が同じオブジェクトを参照し、オーバーヘッドを最小限に抑えます。

一般に、そうでなかったとしても、実際に心配する必要はありません。他のことが起こっていることに比べて、おそらく気付かないほど小さいからです。

ただし、少し興味深いコードを次に示します。

>>> def somefunc(x):
...    print id(x) # prints the memory address of object pointed to by x
... 
>>> 
>>> def test():
...    somefunc("hello")
... 
>>> test()
134900896
>>> test()
134900896 # Hooray, like expected, it's the same object id
>>> somefunc("h" + "ello")
134900896  # Whoa, how'd that work?

ここで起こっていることは、Python がグローバルな文字列ルックアップを保持していることです。多くの場合、2 つの文字列を連結した場合でも、値が一致すれば同じオブジェクトが得られます。

これは実装の詳細であり、ファイル、ソケット、データベース、文字列スライシング、正規表現、または実際には C モジュールのいずれかからの文字列がこのプロパティを持つことが保証されていないため、それに依存しないでください。しかし、それはそれで面白いです。

于 2010-02-17T13:57:45.937 に答える