如何处理plpython中的import语句?

Mau*_*uli 16 python postgresql json plpython postgresql-9.1

我有一个plypython函数,可以做一些json魔法.为此,它显然导入了json库.

每次调用函数时是否调用导入?我必须注意哪些性能影响?

Pet*_*aut 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(...)
$$;
Run Code Online (Sandbox Code Playgroud)

这当然不是很漂亮,正在讨论更好的方法,但它们不会发生在PostgreSQL 9.4之前.

  • 啊,只有在您回答之后,我才在文档中查找了全局字典 SD。非常感谢。 (2认同)
  • @PeterEisentraut 我认为这是错误的。如果你运行 ```do $$ import functools $$ language plpython3u;``` 然后 ```do $$ import sys if 'functools' in sys.modules: plpy.notice('functools has已经被导入') else : plpy.notice('functools 尚未导入') $$ language plpython3u;``` 输出为 'functools 已导入' (2认同)

Mic*_*oka 5

PL/Python 函数体中的声明最终将成为普通的 Python 函数,因此行为也如此。当 Python 函数第一次导入模块时,该模块会缓存在sys.modules字典中 ( https://docs.python.org/3/reference/import.html#the-module-cache )。同一模块的后续导入将简单地将导入名称绑定到字典中找到的模块对象。从某种意义上说,我所说的可能会对已接受答案中给出的提示的有用性产生一些怀疑,因为它使它有些多余,因为Python已经为您做了类似的缓存。

总而言之,我想说,如果您以简单使用importorfrom [...] import构造的标准方式导入,那么您不必担心重复导入,无论是在函数中还是其他方式,Python 都可以满足您的要求。

另一方面,Python 允许您绕过其本机导入语义并实现您自己的(使用函数__import__()importlib模块)。如果这就是您正在做的事情,也许您应该查看工具箱中可用的内容(https://docs.python.org/3/reference/import.html)。