更有效的方法

时间:2010-10-07 19:50:05

标签: python optimization

for i in vr_world.getNodeNames():
    if i != "_error_":
         World[i] = vr_world.getChild(i)

vr_world.getNodeNames()返回一个巨大的列表,vr_world.getChild(i)返回一个特定类型的对象。

这需要很长时间才能运行,无论如何都要提高效率吗?我之前已经看到过for-liners for循环应该更快。想法?

4 个答案:

答案 0 :(得分:1)

我认为你不能比你那里更快。是的,你可以将整个事情放在一条线上,但这不会让它变得更快。瓶颈显然是getNodeNames()。如果你可以让它成为一个生成器,你将开始更快地填充World dict结果(如果这对你很重要),如果你过滤掉"_error_"值,你将没有这笔交易在稍后的阶段。

答案 1 :(得分:1)

kaloyan建议使用发电机。这就是为什么这可能会有所帮助。

如果getNodeNames()构建了一个列表,那么你的循环基本上会遍历列表两次:一次构建它,一次迭代列表。

如果getNodeNames()是一个生成器,那么你的循环不会构建列表;而不是创建项目并将其添加到列表,它创建项目并将其产生给调用者。

这是否有帮助取决于几件事情。首先,它必须可能来实现getNodeNames()作为生成器。我们对该函数的实现细节一无所知,因此无法确定是否属于这种情况。接下来,您要迭代的项目数量必须非常大。

当然,如果事实证明所有这些中耗时的操作是vr_world.getChild(),那么这一切都不会产生任何影响。这就是您需要分析代码的原因。

答案 2 :(得分:0)

World = dict((i, vr_world.getChild(i)) for i in vr_world.getNodeNames() if i != "_error_")

这是一个单行,但不一定比你的解决方案快得多......

答案 3 :(得分:0)

也许您可以使用过滤器和地图,但我不知道这是否会更快:

valid = filter(lambda i: i != "_error_", vr_world.getNodeNames())
World = map(lambda i: vr_world.getChild(i), valid)

另外,正如你在这里看到很多,首先介绍,然后优化,否则你可能会浪费时间。你有两个功能,也许它们是缓慢的部分,而不是迭代。