Как обрабатываются операторы импорта в plpython?
У меня есть функция plypython, которая делает магию json. Для этого он, очевидно, импортирует библиотеку JSON.
Вызывается ли импорт при каждом вызове функции? Есть ли какие-либо последствия для производительности, о которых я должен знать?
1 ответ
import
выполняется при каждом вызове функции. Это то же самое поведение, которое вы получили бы, если бы вы написали обычный модуль Python с import
оператор внутри тела функции в отличие от на уровне модуля.
Да, это повлияет на производительность.
Вы можете обойти это, кэшируя ваши импорта следующим образом:
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.
Объявление в теле функции PL/Python в конечном итоге станет обычной функцией Python и, таким образом, будет вести себя соответствующим образом. Когда функция Python впервые импортирует модуль, модуль кэшируется вsys.modules
словарь (https://docs.python.org/3/reference/import.html). Последующий импорт того же модуля просто привяжет имя импорта к объекту модуля, найденному в словаре. В некотором смысле то, что я говорю, может вызвать некоторые сомнения в полезности совета, данного в принятом ответе, поскольку он делает его несколько избыточным, поскольку Python уже выполняет аналогичное кеширование для вас.
Подводя итог, я бы сказал, что если вы импортируете стандартным способом, просто используя import
или from [...] import
конструкции, то вам не нужно беспокоиться о повторном импорте, в функциях или в других случаях, Python поможет вам.
С другой стороны, Python позволяет обойти собственную семантику импорта и реализовать свою собственную (с __import__()
функция и importlib
модуль). Если это то, что вы делаете, возможно, вам стоит проверить, что доступно в панели инструментов (https://docs.python.org/3/reference/import.html).