我对在数百万节点和上千万边的大型网络上进行网络分析很感兴趣。我想要能够解析多种数据格式的网络,找出连通组件,检测社区,并运行类似PageRank的中心度量。
我被NetworkX所吸引,因为它有良好的API、优秀的文档,并且已经处于活跃开发状态多年。此外,由于它是用Python编写的,应该可以快速开发。
在最近的一个演示文稿中(幻灯片可在github上这里找到),声称:
“与许多其他工具不同,NX设计用于处理与现代问题相关的规模数据...大多数NX核心算法依赖于极快的旧代码。”
演示文稿还指出,NetworkX的基本算法是用C/Fortran实现的。
然而,查看源代码后,NetworkX似乎主要是用Python编写的。我对源代码不是太熟悉,但我知道其中一些例子,NetworkX使用NumPy来完成重负载(进而使用C/Fortran进行线性代数)。例如,文件
是否有人知道这种调用像NumPy这样的优化库的策略在整个NetworkX中是否真的普遍存在,还是只有少数算法使用它?还能描述与NetworkX相关的其他可扩展性问题吗?
NetworkX主程序员的回复:
我在NetworkX邮件列表上提出了这个问题,Aric Hagberg回答说:
“NetworkX使用的数据结构适用于扩展到大规模问题(例如,数据结构是邻接表)。算法具有各种缩放属性,但其中一些可以使用(例如PageRank、连通组件,在边数上呈线性复杂度)。
目前NetworkX是纯Python代码。 邻接结构
我被NetworkX所吸引,因为它有良好的API、优秀的文档,并且已经处于活跃开发状态多年。此外,由于它是用Python编写的,应该可以快速开发。
在最近的一个演示文稿中(幻灯片可在github上这里找到),声称:
“与许多其他工具不同,NX设计用于处理与现代问题相关的规模数据...大多数NX核心算法依赖于极快的旧代码。”
演示文稿还指出,NetworkX的基本算法是用C/Fortran实现的。
然而,查看源代码后,NetworkX似乎主要是用Python编写的。我对源代码不是太熟悉,但我知道其中一些例子,NetworkX使用NumPy来完成重负载(进而使用C/Fortran进行线性代数)。例如,文件
networkx/networkx/algorithms/centrality/eigenvector.py
使用NumPy计算特征向量。是否有人知道这种调用像NumPy这样的优化库的策略在整个NetworkX中是否真的普遍存在,还是只有少数算法使用它?还能描述与NetworkX相关的其他可扩展性问题吗?
NetworkX主程序员的回复:
我在NetworkX邮件列表上提出了这个问题,Aric Hagberg回答说:
“NetworkX使用的数据结构适用于扩展到大规模问题(例如,数据结构是邻接表)。算法具有各种缩放属性,但其中一些可以使用(例如PageRank、连通组件,在边数上呈线性复杂度)。
目前NetworkX是纯Python代码。 邻接结构
使用Python字典编码提供了很大的灵活性,但代价是内存和计算速度。大型图形将占用大量内存,最终将耗尽。
NetworkX确实使用NumPy和SciPy进行基于线性代数的算法。在这种情况下,图形被表示为邻接矩阵,使用NumPy矩阵或SciPy稀疏矩阵进行复制。这些算法可以从NumPy和SciPy底层使用的遗留C和FORTRAN代码中受益。