私はいくつかのjsonマジックを行うplypython関数を持っています。このため、明らかにjsonライブラリをインポートします。
関数を呼び出すたびにインポートが呼び出されますか?注意しなければならないパフォーマンスへの影響はありますか?
私はいくつかのjsonマジックを行うplypython関数を持っています。このため、明らかにjsonライブラリをインポートします。
関数を呼び出すたびにインポートが呼び出されますか?注意しなければならないパフォーマンスへの影響はありますか?
はimport
すべての関数呼び出しで実行されます。import
これは、モジュール レベルではなく、関数本体内にステートメントを使用して通常の Python モジュールを記述した場合と同じ動作になります。
はい、これはパフォーマンスに影響します。
次のようにインポートをキャッシュすることで、これを回避できます。
CREATE FUNCTION test() RETURNS text
LANGUAGE plpythonu
AS $$
if 'json' in SD:
json = SD['json']
else:
import json
SD['json'] = json
return json.dumps(...)
$$;
これは確かにあまりきれいではなく、これを行うためのより良い方法が議論されていますが、PostgreSQL 9.4 より前には実現しません。
PL/Python 関数の本体での宣言は、最終的には通常の Python 関数になり、そのように動作します。Python 関数が初めてモジュールをインポートすると、モジュールはsys.modules
辞書にキャッシュされます ( https://docs.python.org/3/reference/import.html#the-module-cache )。同じモジュールの後続のインポートは、インポート名をディクショナリで見つかったモジュール オブジェクトにバインドするだけです。ある意味で、私が言っていることは、受け入れられた回答で与えられたヒントの有用性に疑問を投げかけるかもしれません.Pythonはすでに同様のキャッシュを行っているため、多少冗長になるからです。
import
要約すると、単純にor構文を使用する標準的な方法でインポートするfrom [...] import
場合、関数内またはその他の方法で繰り返しインポートすることを心配する必要はありません。Python がカバーしてくれます。
一方、Python では、ネイティブのインポート セマンティクスをバイパスして、(__import__()
関数とimportlib
モジュールを使用して) 独自のものを実装できます。これがあなたが行っていることである場合は、ツールボックス ( https://docs.python.org/3/reference/import.html ) で利用できるものを確認する必要があります。