Apl*_*lex 2 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))
Run Code Online (Sandbox Code Playgroud)
谢谢!
Eri*_*nil 11
我们假设x,y,z必须是正整数.否则就会有无穷无尽的解决方案.
这是一个应该比你快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))
Run Code Online (Sandbox Code Playgroud)
通过迭代x,y并且z,你基本上是在黑暗中拍摄,并希望它的土地上1950.
但是你知道50 * y = 1950 - x * 80 - z * 65,所以你可以y直接从x和计算z.
50 * y应该是正数,如果y是一个整数,它应该可以被50整除.
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))
Run Code Online (Sandbox Code Playgroud)
通过在wolfram alpha中键入等式,我们得到:
整数解:y = 13 n + x,z = -10 n - 2 x + 30,n元素Z.
那很完美!对于任何一个x,我们只需要选择n这样既y和z是积极的.不再需要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))
Run Code Online (Sandbox Code Playgroud)
它几乎适合一行:
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)]
Run Code Online (Sandbox Code Playgroud)
此代码比原始代码快300万倍:)