繁体   English   中英

Python - 更快的循环方式

[英]Python - faster way to do for loops

我只是想知道是否有人知道更快/更有效的方法来测试它。

(假设写出方程式的每个解决方案)

        for z in range(500):
           for x in range(500):
             for y in range(500):
               if (x * 80) + (z * 65) + (y * 50) == 1950:
                 print("x " + str(x) + " z " + str(z) + " y " + str(y))

谢谢!

我们假设x,y,z必须是正整数。 否则就会有无穷无尽的解决方案。

从x和z计算y

这是一个应该比你快500倍的方法,因为它不会迭代y:

for z in range(500):
    for x in range(500):
        fifty_y = 1950 - (x * 80) - (z * 65)
        if fifty_y >= 0 and (fifty_y % 50) == 0:
            y = fifty_y // 50
            print("x " + str(x) + " z " + str(z) + " y " + str(y))

通过迭代xyz ,你基本上是在黑暗中拍摄并希望它在1950登陆。

但是你知道50 * y = 1950 - x * 80 - z * 65 ,所以你可以直接从xz计算y

50 * y应该是正数,如果y是整数,它应该可以被50整除。

限制x和z

如果我们希望y为正数,则range(500)对于xz来说太大了。

range(1950 // 65 + 1)应该足够z

知道zrange((1950 - 65 * z)// 80 + 1)对于x就足够了。

作为奖励,我们确定50 * y为正,我们可以删除一个测试:

for z in range(1950 // 65 + 1):
    for x in range((1950 - 65 * z) // 80 + 1):
        fifty_y = 1950 - (x * 80) - (z * 65)
        if (fifty_y % 50) == 0:
            y = fifty_y // 50
            print("x " + str(x) + " z " + str(z) + " y " + str(y))

使用Wolfram Alpha

通过在wolfram alpha中键入等式,我们得到:

整数解:y = 13 n + x,z = -10 n - 2 x + 30,n元素Z.

那很完美! 对于任何x ,我们只需要选择n ,使yz都为正。 有没有必要if了。 此代码重复42次以显示42个解决方案:

for x in range(1950 // 80 + 1):
    for n in range(- (x // 13), (30 - 2 * x) // 10 + 1):
        z = -10 * n - 2 * x + 30
        y = 13 * n + x
        print("x " + str(x) + " z " + str(z) + " y " + str(y))

它几乎适合一行:

print [(x, 13 * n + x, 30 - 10 * n - 2 * x) for x in range(25) for n in range(-(x // 13), (30 - 2 * x) // 10 + 1)]

此代码比原始代码快300万倍:)

这将使您成为包含生成1950的x,y,z值的列表生成器。生成器构造的优点是在调用时生成值,而不是创建对象。

the_vals = ([x,y,z] for x in range(500) for y in range(500) for z in range(500) if (x * 80) + (z * 65) + (y * 50) == 1950)

然后将它打印出来就可以了

for x,y,z in the_vals:
    print("x " + str(x) + " z " + str(z) + " y " + str(y))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM