更新python igraph中的容量

时间:2017-06-21 01:59:24

标签: python igraph

我目前正在审核一个工作系统,以确定可以优化的区域。我发现下面的循环将运行时间增加了大约70%

for t in G.get_edgelist():
    eid = G.get_eid(*t)
    origin = G.vs[t[0]]['name']
    destin = G.vs[t[1]]['name']

    if fc.cpdict[origin]['node_type'] == 'dependency':
        cp_func[nodes.index(destin)] *= cp_func[nodes.index(origin)]

    cap = cp_func[nodes.index(origin)]
    G.es[eid]["capacity"] = cap

系统需要更新自上次模型时间迭代以来已更改的边的容量。在why-is-add-edge-function-so-slow-ompared-to-add-edges中,答案说明了

  

原因是igraph使用索引边列表作为C层中的数据结构。索引使得可以在恒定时间内查询特定顶点的邻居。如果您的图表很少更改,这很好,但是当修改操作比查询更频繁时,它会成为负担,因为无论何时添加或删除边缘,都必须更新索引。

是否有更好的方法来进行此更新。

1 个答案:

答案 0 :(得分:0)

如果其他人正在寻求帮助,或者有更好的解决方案。在查看文档后,我进行了以下更改:

function readSalesNum() {
var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");

// Copy from 17th row, 4th column, all rows for one column 
var valuesToCopy = sheetFrom.getRange(2, 3, sheetFrom.getLastRow(), 1).getValues();

//Paste to another sheet from first cell onwards
sheetTo.getRange(2,sheetTo.getLastColumn()+1,valuesToCopy.length,1).setValues(valuesToCopy);
}

我使用与我的有序字典相同的顺序创建节点,然后使用索引检索顶点。这提高了10-20%。