2011-10-03 70 views
1

我有两个字典对象,连接和网络。这可以形象化为一个图形,其中每个节点是一台计算机,并且连接表示计算机和节点之间的边界。网络是唯一的网络的字典对象,其中计算机可以是一个部件,用于离Python中的非顺序循环优化

1,2 
2,3 
4,5 
5,1 

是节点1的四个连接信息通过1个
连接从而将{1-> 1,2-> 1 ,3> 1,4-> 2,5-> 1}
和网络{1-> 0,2-> 1}
这意味着
计算机1,2,3,5是N/w 1
计算机4是n/w 2的一部分
再次n/w 2互连到n/w 1
我必须读取文件这样的连接信息
千元,而这样做,为每个连接的信息阅读我有如下

while network.has_key(connections[node1]): 
    connections[node1]=network[connections[node1]] 

有没有更好的方式来优化上述环能进行非连续循环?如果需要,我可以分享我的整个代码为宗旨

+0

“非顺序循环”是什么意思?据推测,你正在顺序阅读单个文件,我认为这是你的瓶颈。 –

+0

你有没有想过分析你的代码? CProfile是伟大的http://docs.python.org/library/profile.html - 之后,你将清楚你的瓶颈是什么 –

+0

@oxtopus,请检查代码片段。非序列意味着我既不能使用列表理解也没有任何列表功能,如减少... – Abhijit

回答

1
while network.has_key(connections[node1]): 
    connections[node1]=network[connections[node1]] 

该代码确实为network[connections[node1]]查找一次两次has_key和一次[]

也多次访问connections[node1]

相反,你可以这样做:

current = connections[node1] 
while True: 
    try: 
     current = network[current] 
    except KeyError: 
     break 
connections[node1] = current 

但机会是更好的改进就可以了可以重新加工您的代码的其余部分。但为此,您可能会发现http://codereview.stackexchange.com是一个更好的网站。

+0

愚蠢的我。我对此完全失明。我以某种方式试图从完全不同的角度来看待这个问题。 – Abhijit

+0

从cProfiler中我发现这行代码是我整个系统的瓶颈。在这里缩短50%的时间最终可以减少20%的处理时间。 – Abhijit

+0

@ user977038,也许通常你通过避免来到这里来解决这种事情,而不是让它更快。 –

2

我真的不明白你的问题,但我觉得股票答案绘制相关的问题在这里也适用:

使用NetworkX而不是试图拿出自己的数据表示和算法。学习起来可能比较困难,但从长远来看,这会节省您的时间和头痛。

+0

我实际上使用NetworkX来创建我的程序的最初原型。工作得很好。我现在试图在没有它的情况下编码。因为我在这里优化每一点我觉得有明显的理由表现有瓶颈。 – Abhijit

+0

啊。然后看看Cython。 –