Как обрабатываются операторы импорта в 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).

Другие вопросы по тегам