【发布时间】:2011-12-20 04:48:12
【问题描述】:
我对具有数百万个节点和数千万条边的大型网络的网络分析感兴趣。我希望能够做一些事情,比如解析多种格式的网络、查找连接的组件、检测社区以及运行 PageRank 等中心性度量。
我被 NetworkX 所吸引是因为它有一个很好的 api、良好的文档,并且多年来一直在积极开发中。另外,因为它是在 python 中的,所以应该可以快速开发。
在最近的一次演示中(幻灯片可在 github here 上找到),声称:
与许多其他工具不同,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 的邻接矩阵 稀疏矩阵。这些算法可以从遗留的 C 和 在 NumPy 和 SciPY 中使用的 FORTRAN 代码。
【问题讨论】:
-
目前我自己似乎无法检查源代码。但无论如何,请考虑:80% 的时间可能花在 20% 的代码上。 Mercurial主要是用 Python 编写的,但与主要是 C 的 Git 相比,我还没有听到有人抱怨它的速度。
-
是的,但我也担心内存问题。 networkx 中的图形表示是一个 python 库。这是否意味着我只能将较小的图形放入内存中?
标签: python graph social-networking libraries