Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—循环执行的更快方法_Python_Performance_For Loop - Fatal编程技术网

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