Python - 更快的循环方式

标签 python performance for-loop

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

(假设写出方程的每一个解)

        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))

通过遍历 x , yz ,你基本上是在黑暗中射击并希望它落在 1950 上.

但你知道 50 * y = 1950 - x * 80 - z * 65 , 所以你可以计算出 y直接来自 xz .

50 * y应该是积极的,如果y是一个整数,应该能被50整除。

限制 x 和 z

range(500)对于 x 来说太大了和 z如果我们想要 y积极。

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

知道z , range((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 中输入方程式,我们得到:

Integer solution: y = 13 n + x, z = -10 n - 2 x + 30, n element 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 万倍:)

关于Python - 更快的循环方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42728622/

相关文章:

Python 语法和其他检查?

java - Java 中使用 obj.getXY() 和 Object o = obj.getXY() 的性能

c# - IIS 工作进程和工作线程

javascript - 无法理解 JS 中这个 for 循环的输出

python - 手动功能对 3 个数字进行排序,从最低到最高

python - 比较并查找不同 Excel 文件的两个特定列中的相同条目

python - Selenium、Python,是否可以缩小定位器范围?

c# - LINQ在简单操作中的效率

python - 使用 for 循环调整 etopo 中的网格数据大小

javascript - 查找数组中重复字符的唯一索引