Python嵌套循环速度问题

2024-04-16 15:53:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个程序,以测试理想的角度值来构建一些东西。现在我被困在一个嵌套的for循环中,我将在下面附加它。虽然理想情况下,它会将每个“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
                                .
                                .

Tags: in程序a2fora1情况oka3
3条回答

itertools.product()函数将大大加快嵌套for循环的速度。你知道吗

也就是说,运行时间可能由调用mathmatvec()的总次数决定。你知道吗

解决方案:使用不同的算法。你知道吗

现在,执行最内部的循环999*(76**5)==2532989850624次。这可能太多了,除非最里面的循环计算是微不足道的。你知道吗

你说你想“测试理想的角度值来构造一些东西。”如果你能形式化“理想”的意思,你可以使用优化算法来确定你想要的。如果您能提供更多关于您正在搜索的内容的详细信息,我们可能会告诉您一个更好的Python例程或算法。你知道吗


如果我理解正确,mathmatvec()只取值0和1,你想为15 <= a1 <= 90等找到a1,a2,a3,a4,为1 <= ite <= 999找到ite,使mathmatvec(a1, a2, a3, a4, ite)等于1,其中ite尽可能小。你知道吗

通过使用函数,您可以使这成为一个多维最小化问题

def func(a1, a2, a3, a4, ite):
    return ite - 1000 * mathmatvec(a1, a2, a3, a4, ite)

然后func()mathmatvec() == 0返回一个正数,为mathmatvec() == 1返回一个负数,当ite最小化时,负值最小化。你知道吗

根据函数mathmatvec()的“平滑程度”、“连接程度”以及它的适应度情况,scipy.optimize中的一个最小化例程可以很好地解决问题。scipy.optimize.differential_evolution() function看起来特别有趣。你知道吗

您可以尝试将for循环转换为while循环,速度应该更快,因为后者不会创建任何迭代器。所以不是:

for a1 in xrange(15, 91):

写:

a1 = 15
while a1 < 91:
    ...
    a1 += 1

或者尝试使用PyPy。你知道吗

相关问题 更多 >