После просмотра кода была найдена следующая функция:
def coalesce(*args, null=None):
return next((obj for obj in args if obj is not null and obj != null), null)
Есть ли более эффективный способ выполнения этой операции или более питонский подход к проблеме?
Первая альтернатива была следующей:
def coalesce(*args):
return next(filter(None, args), None)
Вот второй вариант, который был опробован:
def coalesce(*args, null=None):
return next(itertools.filterfalse(functools.partial(operator.eq, null), args), null)
Это третья альтернатива, которая пришла в голову:
def coalesce(*args):
return next((obj for obj in args if obj is not None), None)
Четвертая альтернатива была написана в надежде, что код, написанный на C, будет быстрее:
def coalesce(*args):
return next(itertools.filterfalse(functools.partial(operator.is_, None), args), None)
Используя timeit
, результаты синхронизации для трех различных функций были:
- +0,7040689999994356
- +0,3396129999891855
- +0,8870604000112507
- +0,5313313000078779
- +0,8086609000019962
Казалось бы, это указывает на то, что вторая функция предпочтительнее, но это не отвечает на вопрос о том, какая из них наиболее питонская.