我需要能够在python中操作一个大的(10 ^ 7个节点)图形。 对应于每个节点/边缘的数据是最小的,例如,少量的字符串。 内存和速度方面,最有效的方法是什么?

dicts的词典更灵活,更易于实现,但我直观地期望列表列表更快。 list选项还要求我将数据与结构分开,而dicts允许这样的东西:

graph[I][J]["Property"]="value"

你会建议什么?


是的,我应该对效率的意思更清楚一点。 在这个特殊情况下,我的意思是随机访问检索。

将数据加载到内存中不是一个大问题。 这是一劳永逸的。 耗时的部分是访问节点,因此我可以提取信息并测量我感兴趣的指标。

我没有考虑过让每个节点成为一个类(所有节点的属性都相同),但似乎会增加一层额外的开销? 我希望有人可以直接体验他们可以分享的类似案例。 毕竟,图形是CS中最常见的抽象之一。

===============>>#1 票数:52 已采纳

我强烈建议你看看NetworkX 它是经过实战考验的战马,是大多数“研究”类型在他们需要对基于网络的数据进行分析时所能达到的第一个工具。 我已经在笔记本上操作了数百个边缘的图形而没有问题。 它功能丰富,非常易于使用。 你会发现自己更多地关注手头的问题而不是底层实现的细节。

Erdős-Rényi随机图生成和分析的示例


"""
Create an G{n,m} random graph with n nodes and m edges
and report some properties.

This graph is sometimes called the Erd##[m~Qs-Rényi graph
but is different from G{n,p} or binomial_graph which is also
sometimes called the Erd##[m~Qs-Rényi graph.
"""
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
__credits__ = """"""
#    Copyright (C) 2004-2006 by 
#    Aric Hagberg 
#    Dan Schult 
#    Pieter Swart 
#    Distributed under the terms of the GNU Lesser General Public License
#    http://www.gnu.org/copyleft/lesser.html

from networkx import *
import sys

n=10 # 10 nodes
m=20 # 20 edges

G=gnm_random_graph(n,m)

# some properties
print "node degree clustering"
for v in nodes(G):
    print v,degree(G,v),clustering(G,v)

# print the adjacency list to terminal 
write_adjlist(G,sys.stdout)

可视化也很简单:

在此输入图像描述

更多可视化: http//jonschull.blogspot.com/2008/08/graph-visualization.html

===============>>#2 票数:13

即使这个问题现在很老了,我认为值得一提的是我自己的python模块用于图形操作,称为图形工具 它非常有效,因为数据结构和算法是用C ++实现的,使用Boost Graph Library进行模板元编程。 因此,它的性能(内存使用和运行时)与纯C ++库相当,并且可以比典型的python代码好几个数量级,而不会牺牲易用性。 我经常使用它来处理非常大的图形。

===============>>#3 票数:6

如前所述,NetworkX非常好,另一个选项是igraph 这两个模块将拥有您可能需要的大多数(如果不是全部)分析工具,并且这两个库通常用于大型网络。

===============>>#4 票数:4

字典也可能包含开销,具体取决于实际实现。 哈希表通常包含一些可用节点的素数,即使您可能只使用几个节点。

从你的例子“财产”来看,你是否会更好地采用最终级别和真实属性的类方法? 或者属性的名称是否在节点之间发生了很大变化?

我会说“有效”意味着什么取决于很多事情,比如:

  • 更新速度(插入,更新,删除)
  • 随机访问检索的速度
  • 顺序检索的速度
  • 使用的记忆

我认为你会发现一个快速的数据结构通常比一个慢的数据结构消耗更多的内存。 情况并非总是如此,但大多数数据结构似乎都遵循这一点。

字典可能很容易使用,并且为您提供相对统一的快速访问,它很可能会使用比您建议的列表更多的内存。 但是,列表在向其中插入数据时通常会包含更多开销,除非它们预先分配X节点,否则它们将再次使用更多内存。

总的来说,我的建议是只使用对您来说最自然的方法,然后对系统进行“压力测试”,向其中添加大量数据并查看它是否成为问题。

您还可以考虑在系统中添加一个抽象层,这样如果以后需要更改内部数据结构,则无需更改编程接口。

===============>>#5 票数:3

据我了解,随机访问对于Python的dicts和列表都是恒定的时间,区别在于你只能随机访问带有列表的整数索引。 我假设您需要按标签查找节点,因此您需要一个dicts的字典。

但是,在性能方面,将其加载到内存中可能不是问题,但如果你使用太多,你最终会交换到磁盘,这将破坏Python高效的dicts的性能。 尽量减少内存使用量。 此外,RAM现在非常便宜; 如果你做了很多这样的事情,没有理由不至少有4GB。

如果您希望了解如何降低内存使用率,请提供有关您为每个节点跟踪的信息类型的更多信息。

===============>>#6 票数:2

构建基于类的结构可能比基于dict的结构具有更多的开销,因为在python类中实际使用dicts。

===============>>#7 票数:1

毫无疑问,NetworkX是图形界迄今为止最好的数据结构。 它带有辅助函数,数据结构和算法,随机序列生成器,装饰器,Cuthill-Mckee排序,上下文管理器等实用程序

NetworkX非常棒,因为它可以用于图形,有向图和多图形。 它可以用多种方式编写图形:邻接列表,多线邻接列表,边缘列表,GEXF,GML。 它适用于Pickle,GraphML,JSON,SparseGraph6等。

它具有各种radimade算法,包括:近似,二分,边界,中心,Clique,聚类,着色,组件,连通性,循环,有向无环图,距离度量,支配集,欧拉,同构,链接分析,链接预测,匹配,最小生成树,富俱乐部,最短路径,遍历,树。

  ask by bgoncalves translate from so

未解决问题?本站智能推荐:

1回复

在Python中创建C函数的依赖树

我正在尝试使用python解析C程序,并且我需要找到一种方法来实现显示其依赖关系的所有函数的图形。 例如,如果我有这样的程序: 该图将是: 我希望将图形显示为某种形式的数据结构(例如,一棵不可见的树),有人对它有什么建议吗? 编辑:澄清一下,主要问题是我该怎么做解析方法。
2回复

大蟒蛇字典。 存储,加载和写入它

我有一个大的python字典值(大约50 GB),我已将其存储为JSON文件。 在打开文件和写入文件时,我遇到了效率问题。 我知道你可以使用ijson有效地读取文件,但是如何有效地写入文件呢? 我是否应该使用Python字典来存储我的数据? python字典的大小有限吗? (字典会
7回复

构建非循环依赖关系的最简单,最有效的数据结构是什么?

我正在尝试构建一个序列来确定销毁对象的顺序。 我们可以假设没有周期。 如果对象A在其(A)构造期间使用对象B,则对象B在对象A的销毁期间仍应可用。 因此,所需的破坏顺序是A,B。如果另一个对象C在其(C)构造期间也使用对象B,则所需的顺序是A,C,B。通常,只要对象X仅被销毁在构造过程中使
2回复

是否为C#实现了任何图形数据结构

我试图找到一个图形数据结构,以便在C#中重用,但没有任何成功。 当然,我可以从数据结构书中借鉴,但我希望它更具商业实用性(?)如果您能告诉我实现图表的最佳方法,我将不胜感激。 谢谢
1回复

给出列表生成Python字典的最有效方法

我正在寻找以下问题的优化(我有一些工作代码,但我很确定它可能会更快,写得很糟糕)。 我有一个SKU列表(6到9位数字),我正在亚马逊上查找信息。 工作代码如下: 其中x是一般交替的SKU和价格的字典。 但是,由于无法找到价格,因此出现了复杂情况。 在这种情况下,列表(x)是SKU
3回复

Python中大数据结构的性能

我在寻找有助于理解Python中大型列表,字典或数组的性能特征的帮助。 我大约需要暂时存储100万个键值对(明年将增长到1000万个)。 它们的键是数据库ID,范围从0到约1.1M(有一些空隙),值是浮点数。 我正在计算pagerank,因此我的过程是将每个ID初始化为1,然后在内存中
5回复

Python的字典哈希数据结构

我正在构建一个非常大的字典,我正在执行许多检查以查看密钥是否在结构中,然后添加它是否唯一或递增计数器(如果它是相同的)。 Python使用哈希数据结构来存储字典(不要与加密哈希函数混淆)。 查找是O(1),但如果哈希表已满,则必须重新进行,这非常昂贵。 我的问题是,我会更好地使用A
2回复

选择python数据结构以加快算法实现

因此,我得到了大量的列表(大约200k)。 每个列表都包含数字0到27的子集。我想返回其中两个列表的长度乘积大于其他任何一对列表的长度乘积的列表。 还有另一个条件,即列表没有相同的数字。 我为此找到了一种算法(记不清来源,对于道具的非特异性表示歉意),该算法利用了数字0到27的总子集少
3回复

最快获取Python数据结构

我正在开发AI以执行MDP,正在获取状态(在这种情况下只是整数)并为其分配值,我将做很多事情。 因此,我正在寻找一种可以容纳(无需删除)该信息并具有非常快速的获取/更新功能的数据结构。 有比普通字典更快的东西吗? 我正在寻找真的是本地python的任何东西,开源的,我只需要快速获取。
1回复

Python中的高效表示子图(数据结构)

在Python中保存和比较从给定输入图G生成的子图的有效方法是什么? 一些细节: 输入图G是有向的简单图,其顶点数量在n = 100-10000之间变化。 边数-可以假设最大值为完整图的10%(通常更少),因此在这种情况下,最大值为n *(n-1)/ 10 有一种算法可