Thesetwo質問の中では、機能の内側とモジュールの上部の間にimport
を使用してください。私は、私の輸入品を一番上に置くことに納得する必要はありません。それを行う良い理由があります。しかし、技術的な問題をよりよく理解するために、私はフォローアップをお願いしたい。クロージャを使用して関数のインポートを最適化できますか?
クロージャを使用し、関数の最初の実行時にのみインポートすることで、パフォーマンスを最大限に引き出すことができますか?
具体、次のようなコードがあるとします。
def get_version():
import sys
return sys.version
:あなたは機能がこれまでに呼び出された場合にのみ発生するので、あなたが内部を移動するインポートをしたい
import sys
def get_version():
return sys.version
をしかし、今度はの場合はが多く呼び出されますので、もっと複雑なものを試してみてください:
def _get_version():
import sys
def nested():
return sys.version
global get_version
get_version = nested
return nested()
get_version = _get_version
少なくとも基本的なパフォーマンステストでは、この最後のオプションが最初のものよりわずかに遅い(〜110%)が、2番目のものよりもはるかに高速であることが示されています。
まず、これは実際には機能しますか?私の測定値は、2番目の例がもっとうまくいくか、それとも私が物を測定したかの人工物であることを正確に表していますか?
第2に、関数が初めて実行されたときを超えてクロージャからの減速がありますか?逆参照
ピア機能の場合、 'functools'の' lru_cache'デコレータを使用することができます。それが素晴らしいアイデアであるかどうかはわかりませんが、最初に実行した後に関数の結果をキャッシュします。 – sytech
@sytech: 'lru_cache'キャッシュテストはかなり重く、インポートのような軽量なもの(初期のファイルロードを過ぎても名前をバインドするものではありません)のパフォーマンスを大幅に向上させることはできません。 –