Определите, доступна ли функция в модуле Python

Различие между выполнением UPDATE операторов в одной или трех процедурах, вероятно, будет незначительным.

Однако, чтобы повторить комментарии, одно утверждение, вероятно, будет более производительным, чем три утверждения.

Тем не менее, гораздо важнее ограничить UPDATE, так что только перезаписываемые значения необходимо обновлять с помощью предложения WHERE. В противном случае очень вероятно, что для большого количества записей вы будете записывать на диск, чтобы установить значение STATUS на то же значение, которое уже есть. Это убьет производительность.

Вы также, вероятно, получите лучшую скорость от JOIN, чем от дополнительного выбора с IN.

Я бы начал с того, чтобы настроить что-то подобное в вашей ситуации и посмотреть, улучшите ли вы скорость одним вызовом, а не тремя.

UPDATE tgt
SET tgt.STATUS = CASE WHEN src.STATUS IN ('01') THEN '02'
                      WHEN src.STATUS IN ('08') THEN '05'
                      WHEN src.STATUS IN ('04') THEN '06'
FROM
  TABLE AS tgt
  JOIN
  ANOTHER_TABLE AS src
    ON 
      src.ID = tgt.ID
      AND
      src.STATUS IN ('01','04','08')
WHERE 
  tgt.STATUS <>  CASE WHEN src.STATUS IN ('01') THEN '02'
                      WHEN src.STATUS IN ('08') THEN '05'
                      WHEN src.STATUS IN ('04') THEN '06';

Редактировать : кивнуть на ответ Гвидо об ограничении количества записей, извлеченных из ANOTHER_TABLE с предложением IN.

27
задан Community 23 May 2017 в 11:53
поделиться

3 ответа

hasattr () - лучший выбор. Иди с этим. :)

if hasattr(socket, 'fromfd'):
    pass
else:
    pass

РЕДАКТИРОВАТЬ : На самом деле, согласно документам, все, что делает hasattr, вызывает getattr и перехватывает исключение. Поэтому, если вы хотите исключить посредника, вам следует ответить Марко.

РЕДАКТИРОВАТЬ : Я также только что понял, что этот вопрос на самом деле является дубликатом . В одном из ответов на этот вопрос обсуждаются достоинства двух имеющихся у вас вариантов: перехват исключения («просить прощения легче, чем разрешение») или просто проверка перед рукой («посмотри, прежде чем прыгнуть»). Честно говоря, я больше отношусь к последним, но похоже, что сообщество Python склоняется в сторону прежней школы мысли.

42
ответ дан 28 November 2019 в 04:34
поделиться

Или просто используйте блок try..except:

try:
  sock = socket.fromfd(...)
except AttributeError:
  sock = socket.socket(...)
24
ответ дан 28 November 2019 в 04:34
поделиться

hasattr (obj, 'attributetename'), вероятно, лучше. hasattr попытается получить доступ к атрибуту, и если его там нет, он вернет false.

Возможно, в python есть динамические методы, то есть методы, которые создаются, когда вы пытаетесь получить к ним доступ. Они не были бы в реж. (...). Однако hasattr проверит это.

>>> class C(object):
...   def __init__(self):
...     pass
...   def mymethod1(self):
...     print "In #1"
...   def __getattr__(self, name):
...     if name == 'mymethod2':
...       def func():
...         print "In my super meta #2"
...       return func
...     else:
...       raise AttributeError
... 
>>> c = C()
>>> 'mymethod1' in dir(c)
True
>>> hasattr(c, 'mymethod1')
True
>>> c.mymethod1()
In #1
>>> 'mymethod2' in dir(c)
False
>>> hasattr(c, 'mymethod2')
True
>>> c.mymethod2()
In my super meta #2
3
ответ дан 28 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: