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循环应该更快。想法?
答案 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)
另外,正如你在这里看到很多,首先介绍,然后优化,否则你可能会浪费时间。你有两个功能,也许它们是缓慢的部分,而不是迭代。