我需要在Python 2.7中进行简单的数学计算,包括求和,减法,除法,乘法,数字列表之和等等。
我想写出优雅,防弹,高效的代码,但我必须承认我对几件事情感到困惑,例如:
1/(N-1)*x
我应该只编码1/(N-1)*x
或1.0/(N-1)*x
,1.0/(N-1.0)*x
或其他任何组合?//
使用/
还是from __future__ import division
使用math.fsum()
?float(x)
连接浮动列表”?那么在Python中编写用于简单数学计算的代码的最佳实践是
答案 0 :(得分:13)
如果您使用Python 2.7,总是使用from __future__ import division
。它消除了很多混乱和错误。
有了这个,你永远不必担心如果一个分区是浮点数,/
将永远是一个浮点数,//
将永远是一个整数。
您应该使用float()
转换输入。你只会做一次,而且性能不会太高。
我会得到一个像这样的浮点数的总和:sum(li, 0.0)
,但是如果需要精度,请使用专门为此创建的math.fsum
。
最后,你的最后陈述令人困惑。您的意思是1/((N-1)*x)
还是(1/(N-1))*x
?在第一种情况下,我将其写为1 / (x * (N-1))
,在第二种情况下将其写为x / (N-1)
。两者都假设3.x风格分裂。
另外,如果你想要一些真正的表现,请看看numpy。
答案 1 :(得分:2)
如果你想在Python中使用数字代码,那么你应该考虑使用PyPy。 Numpy和scipy对于处理数组很方便,如果你使用它们提供的线性代数算法,它们会提供良好的性能。但是如果你的数值运算是在纯Python代码中,那么PyPy可以显着提高性能。我看到加速比20倍以上。当你使用PyPy时,编写数学表达式的最佳方法是最简单的方法。它会比你更好地优化你的代码,所以尽量使它简单易读。