如何处理plpython中的import语句?

时间:2013-02-22 11:24:47

标签: python json postgresql postgresql-9.1 plpython

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

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

2 个答案:

答案 0 :(得分: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之前。

答案 1 :(得分:1)

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

总而言之,我想说的是,如果您以简单使用importfrom [...] import构造的标准方式进行导入,则无需担心函数或其他方式中的重复导入,Python可以满足您的要求。

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