Python嵌套循环速度问题

时间:2016-05-28 14:14:58

标签: python for-loop

我目前正在研究一个程序来测试理想的角度值来构造一些东西。现在我陷入了一个嵌套的循环,我将在下面附上。虽然理想的是它会计算每个' a'到9000,如果值设置如下,它已经几乎永远。有没有办法加快这个嵌套循环?或者我可以以某种方式为python分配更多的资源?

for a1 in  xrange(15, 91):
    for a2 in xrange(15, 91):
        for a3 in xrange(15, 91):
            for a4 in xrange(15, 91):
                for a5 in xrange(15, 91):
                    for ite in xrange(1, 1000):
                        ok = mathmatvec(a1, a2, a3, a4, a5, ite) 
                        if ok == 1:
                                v[0] = a1
                                v[1] = a2
                                .
                                .

3 个答案:

答案 0 :(得分:1)

itertools.product()函数将大大加快嵌套的for循环。

也就是说,运行时间很可能由对 mathmatvec()的调用总数决定。

答案 1 :(得分:0)

您可以尝试将customer: { data: { type: 'customer', id: '1' }, links: { related: '/customers/1' } } 循环转换为for循环,因为后者不会创建任何迭代器,所以应该更快。所以而不是:

while

写:

for a1 in xrange(15, 91):

或尝试使用PyPy

答案 2 :(得分:0)

解决方案:使用其他算法。

就像现在一样,你执行最里面的循环999 *(76 ** 5)== 2,532,989,850,624次。这可能太多了,除非最里面的循环计算是微不足道的。

你说你想要测试理想的角度值以构建一些东西。"如果你可以正式化什么"理想"意味着,您可以使用优化算法将您想要的内容归零。如果您向我们提供有关您正在搜索的内容的更多详细信息,我们可能会告诉您更好的Python例程或算法。

如果我理解正确,mathmatvec()只接受值0和1,并且您希望为a1,a2,a3,a4等找到15 <= a1 <= 90的值,为{{找到ite的值1}}使1 <= ite <= 999等于1,mathmatvec(a1, a2, a3, a4, ite)尽可能小。

您可以使用函数

使其成为多维最小化问题
ite

然后def func(a1, a2, a3, a4, ite): return ite - 1000 * mathmatvec(a1, a2, a3, a4, ite) 会为func()返回一个正数,为mathmatvec() == 0返回一个正数,当mathmatvec() == 1最小化时,负值会被最小化。

取决于&#34;顺畅&#34;你的函数ite,它是如何连接的,它的适应性格局,scipy.optimize中的最小化例程之一可以很好地解决你的问题。 scipy.optimize.differential_evolution() function看起来特别有趣。