【问题标题】:Non Sequential Loop Optimization in PythonPython中的非顺序循环优化
【发布时间】:2011-11-30 01:50:41
【问题描述】:

我有两个字典对象,连接和网络。这可以可视化为一个图,其中每个节点都是一台计算机,连接描绘了计算机和节点之间的一条边。网络是唯一网络的字典对象,计算机可以成为其中的一部分,例如

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]] 

有没有更好的方法来优化上述循环?如果需要,我可以为此目的分享我的整个代码

【问题讨论】:

  • “非顺序循环”是什么意思?据推测,您正在按顺序读取单个文件,我假设这是您的瓶颈。
  • 你有没有想过分析你的代码? CProfile 很棒 docs.python.org/library/profile.html - 之后您将清楚地了解您的瓶颈是什么
  • @oxtopus,请检查代码 sn-p。非顺序意味着我既不能使用列表理解,也不能使用任何列表函数,如 reduce ...
  • @savinos,是的,我试过了,这就是我识别上述代码 sn-p 的方式

标签: python optimization loops nonsequential


【解决方案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 是一个更好的网站。

【讨论】:

  • 我太傻了。我对此完全视而不见。我不知何故试图从一个完全不同的角度来看待这个问题。
  • 从 cProfiler 我发现这行代码是我整个系统的瓶颈。在这里减少 50% 的时间最终可能会减少 20% 的处理时间。
  • @user977038,也许,但通常你通过避免来这里来解决这类问题,而不是加快速度。
  • @user977038,通过避免来到这里,我的意思是执行期间的一段代码。不要让这段代码更快。少叫它。
【解决方案2】:

我并没有真正理解你的问题,但我觉得与图表相关的问题的常见答案在这里适用:

使用NetworkX,而不是尝试提出自己的数据表示和算法。它可能更难学习,但从长远来看,它会为您节省时间和头痛。

【讨论】:

  • 我实际上使用 NetworkX 来创建程序的初始原型。工作得很好。我现在尝试在没有它的情况下编写相同的代码。明显的原因性能,因为我在这里优化我觉得有瓶颈的每一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2015-07-24
  • 2017-02-21
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多