【发布时间】:2012-06-28 14:40:30
【问题描述】:
我正在尝试在 Python 中完成以下逻辑操作,但遇到了内存和时间问题。因为,我对 python 很陌生,所以关于如何以及在哪里优化问题的指导将不胜感激! (我明白下面的问题有些抽象)
import networkx as nx
dic_score = {}
G = nx.watts_strogatz_graph(10000,10,.01) # Generate 2 graphs with 10,000 nodes using Networkx
H = nx.watts_strogatz_graph(10000,10,.01)
for Gnodes in G.nodes()
for Hnodes in H.nodes () # i.e. For all the pair of nodes in both the graphs
score = SomeOperation on (Gnodes,Hnodes) # Calculate a metric
dic_score.setdefault(Gnodes,[]).append([Hnodes, score, -1 ]) # Store the metric in the form a Key: value, where value become a list of lists, pair in a dictionary
然后根据这里提到的标准对生成的字典中的列表进行排序 sorting_criterion
我的问题/疑问是:
1) 有没有比使用 for 循环进行迭代更好的方法来解决这个问题?
2) 解决上述问题的最优化(最快)方法应该是什么?我应该考虑使用字典以外的其他数据结构吗?或者可能是文件操作?
3) 由于我需要对这个字典中的列表进行排序,它有 10,000 个键,每个键对应于 10,000 个值的列表,因此内存需求很快变得巨大,我用完了。
3) 有没有办法将排序过程集成到字典本身的计算中,即避免单独循环排序?
任何意见将不胜感激!谢谢!
【问题讨论】:
-
10^4 x 10^4 节点 = 10^8。当然它很慢。如果没有您正在尝试执行的操作的信息,则运行时间和内存使用情况很难改善。
-
@nhahtdh:基本上,循环代表提取与每个节点关联的向量。我有兴趣从两个图中说出这些向量的所有可能对的点积,即 10000*10000 对。因此,每个节点都将与 10000 个这样的点积相关联,然后我想对其进行排序并保存以供进一步处理。正如您正确提到的,计算时间很长,内存需求也很大,我想优化,可能是通过一些文件操作或您可能有的任何其他建议。
标签: python performance sorting memory networkx