如何处理plpython中的导入语句?

问题描述 投票:16回答:2

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

每次调用该函数都会调用导入吗?我需要了解任何性能暗示吗?

python json postgresql postgresql-9.1 plpython
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之前它们不会发生。


0
投票

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)中的可用内容。

© www.soinside.com 2019 - 2024. All rights reserved.