我认为将其保留在列表中没有性能优势。相反,将其放在列表中会使其变慢:
>>> %%timeit
...: x = 3
...: y = 5
...: x2 = x**2
...: z = x2 + exp(y)
...: zz = (y+x)/x2
...:
337 ns ± 1.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> %%timeit
...: x = [3, 5]
...: z = x[0]**2 + exp(x[1])
...: zz = sum(x)/x[0]**2
...:
716 ns ± 4.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
现在部分原因是您在列表条件下计算 x**2 两次,但即使修复该问题也不会使列表版本更快:
>>> %%timeit
...: x = [3, 5]
...: x0 = x[0]**2
...: z = x0 + exp(x[1])
...: zz = sum(x)/x0
...:
502 ns ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
如果您比较性能,另一个大问题是您定义整数然后将它们转换为浮点数。在 MATLAB 中,x = 5 生成一个浮点数,而在 python 中它生成一个整数。从一开始就使用浮点数做所有事情要快得多,您只需在数字末尾添加 . 或 .0 即可:
>>> %%timeit
...: x = 3.0
...: y = 5.0
...: x2 = x**2.0
...: z = x2 + exp(y)
...: zz = (y+x)/x2
...:
166 ns ± 1.12 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
如果你要使用 numpy 数组而不是列表,那就更糟了,因为你从浮点数列表开始,然后必须对数字和列表进行转换,然后再将它们转换回来,所有这些都是慢:
>>> %%timeit
...: x = np.array([3., 5.])
...: x0 = x[0]**2.
...: z = x0 + np.exp(x[1])
...: zz = x.sum()/x0
...:
3.22 µs ± 8.96 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
作为一般规则,应尽可能避免进行类型转换,并在不利于可读性的情况下避免索引。如果您有一堆值,那么转换为 numpy 很有用。但是对于两三个人来说,它会影响速度和可读性。