Я имею дело с древовидной структурой в программе Python. Каждый узел в дереве имеет словарные "сыновья", ключи которых содержат информацию о дуге, а значения - это узлы сына. Вопрос заключается в распространении списка узлов на всех своих сыновей. Я использую:
current_nodes = reduce(lambda s,x:s+x, map(lambda node:node.sons.values(),current_nodes),[])
Где current_nodes
- это начальный (и обновленный) список узлов.
Моя программа тратит больше времени на выполнение этой операции уменьшения. Есть ли более быстрый способ реализовать это?
Спасибо!
EDIT: Привет. Просто сообщите, что код: sum((node.sons.values() for node in current_nodes), [])
хотя и pythonic, на самом деле не намного быстрее - если список узлов длинный (> 20000), распространение замедляется непропорционально, фактически, очень медленно. Я не знаю почему.
Затем я определяю:
def Ext(nodes)
l=[]
for node in nodes:
l.extend(node.sons.values())
return l
Затем я использую: current_node = Ext(current_node)
. Этот подход на самом деле намного быстрее. Я думаю, что функция sum() не так эффективна, как метод расширения списка при обработке конкатенации списков.
from itertools import chain
list(chain.from_iterable(node.sons.values() for node in current_nodes))
Быть быстрее. map
и reduce
на lambda
медленны. Я не знаю, как быстро chain
; вы можете попробовать
sum((node.sons.values() for node in current_nodes), [])
также.
reduce
когдаsum
делает работу? То же самое с этой уродливойmap
:List comprehensions
FTW