Python—循环执行的更快方法
我只是想知道是否有人知道一种更快/更有效的测试方法 (假设写出方程的每一个解)Python—循环执行的更快方法,python,performance,for-loop,Python,Performance,For Loop,我只是想知道是否有人知道一种更快/更有效的测试方法 (假设写出方程的每一个解) 谢谢 这将使您成为一个列表生成器,其中包含生成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 t
谢谢 这将使您成为一个列表生成器,其中包含生成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))
我们假设
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
、y
和z
,您基本上是在黑暗中拍摄,并希望它降落在1950
但是你知道,50*y=1950-x*80-z*65
,所以你可以直接从x
和z
计算y
50*y
应为正,如果y
为整数,则应可被50整除
限制x和z
范围(500)
对于x
和z
来说太大了,如果我们想要y
为正
范围(1950//65+1)
应该足够z
知道z
,范围((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
通过输入方程式,我们得到:
整数解:y=13n+x,z=-10n-2x+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))
它几乎可以概括为一行:
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万倍:)您尝试过列表理解、生成器等功能吗。如果不是,请看看这个概念。这可以帮助你加快过程你是说积分解,对吗?一旦有了
z
和x
,就可以计算y
。您不需要最内部的for-loop,它接受无穷多个解。x,y,z
是正整数吗?@ericdumini没有无限解,因为它只使用范围内的整数。我在想如何用它来减少它。很大一部分搜索空间无效。您的意思是(x*80)+(z*65)+(y*50)=1950
。@Kyrubas您可以将列表理解更改为字典,这可以提高速度。如果(x*80)+(z*65)+(y*50)=1950)不是字典,则_vals=([x,y,z]表示范围(500)内的x,y表示范围(500)内的y,z表示范围(500)内的z)。顺便说一句,你可以避免使用分步和除法进行乘法:([x//80,y//65,z//50]表示范围内的x(0500*80,80)表示范围内的y(0500*65,65)表示范围内的z(0500*50,50),如果x+y+z==1950)
是的,这确实缩短了时间。伟大的解决方案@我还没做完。不要这么快接受答案,可能还有其他有趣的贡献。@roganjosh:它找到了与OP的代码完全相同的解决方案。正如我上面所说的,如果你接受负整数,就会有无穷多的解。@EricDuminil:答案很好,小挑剔:用/
代替/
(整数除法)@Jean-Françoisfare:谢谢。蟒蛇3号警察回来了!你说得对,但我也觉得/
语法太重了。它剪切表达式,看起来像Java注释。
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)]