17

我有一个 plypython 函数,它可以做一些 json 魔术。为此,它显然导入了 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 已经为您做了类似的缓存。

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

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

于 2020-03-15T20:55:52.193 回答