在Python中进行简单数学计算的最佳实践
我需要在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中编写简单数学计算的代码,哪些做法是最好的呢?
- 优雅/符合Python风格,
- 高效,
- 能应对输入数据类型(浮点数和整数)不确定性的问题?
2 个回答
2
如果你想让Python中的数值代码运行得更快,可以考虑使用PyPy。Numpy和scipy在处理数组方面很方便,如果你使用它们提供的线性代数算法,性能也不错。但如果你的数值运算是用纯Python代码写的,PyPy能显著提升性能。我见过速度提升超过20倍。而且在使用PyPy时,写数学表达式的最好方式就是最简单的方式。它会比你自己优化得更好,所以尽量让代码简单易读。
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。