17

私はいくつかのjsonマジックを行うplypython関数を持っています。このため、明らかにjsonライブラリをインポートします。

関数を呼び出すたびにインポートが呼び出されますか?注意しなければならないパフォーマンスへの影響はありますか?

4

2 に答える 2

22

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 より前には実現しません。

于 2013-02-22T13:32:05.453 に答える
2

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 ) で利用できるものを確認する必要があります。

于 2020-03-15T20:55:52.193 に答える