Вы пытались просто подавить вывод?Я не думаю, что команда Graph
V8 делает какую-либо разметку, если вы делаете это.Чтобы исследовать это, мы можем сгенерировать большой список ребер и сравнить значения времени graph[edges];
, Graph[edges];
и GraphPlot[edges];
In[23]:= SeedRandom[1];
edges = Union[Rule @@@ (Sort /@
RandomInteger[{1, 5000}, {50000, 2}])];
In[25]:= t = AbsoluteTime[];
graph[edges];
In[27]:= AbsoluteTime[] - t
Out[27]= 0.029354
In[28]:= t = AbsoluteTime[];
Graph[edges];
In[30]:= AbsoluteTime[] - t
Out[30]= 0.080434
In[31]:= t = AbsoluteTime[];
GraphPlot[edges];
In[33]:= AbsoluteTime[] - t
Out[33]= 4.934918
. Инертная команда graph
, конечно,быстрый.Команда Graph
занимает намного больше времени, но не так близко, как команда GraphPlot
.Таким образом, мне кажется, что Graph
на самом деле не вычисляет раскладку, как это делает GraphPlot
.
Логический вопрос заключается в том, на что Graph
тратит свое время.Давайте рассмотрим вывод InputForm
из Graph
в простом случае:
Graph[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 4}] // InputForm
Out[123]//InputForm=
Graph[{1, 2, 3, 4},
{DirectedEdge[1, 2],
DirectedEdge[2, 3],
DirectedEdge[3, 1],
DirectedEdge[1, 4]}]
Обратите внимание, что вершины графа определены, и я думаю, что именно это и делает Graph
.Фактически, количество времени, которое потребовалось для вычисления Graph[edges]
в первом примере, сопоставимо с самым быстрым способом, который я могу себе представить, чтобы сделать это:
Union[Sequence @@@ edges]; // Timing
Это заняло 0,087045 секунд.