在Python中进行简单数学计算的最佳实践

4 投票
2 回答
1696 浏览
提问于 2025-04-17 09:15

我需要在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中编写简单数学计算的代码,哪些做法是最好的呢?

  1. 优雅/符合Python风格,
  2. 高效,
  3. 能应对输入数据类型(浮点数和整数)不确定性的问题?

2 个回答

2

如果你想让Python中的数值代码运行得更快,可以考虑使用PyPy。Numpy和scipy在处理数组方面很方便,如果你使用它们提供的线性代数算法,性能也不错。但如果你的数值运算是用纯Python代码写的,PyPy能显著提升性能。我见过速度提升超过20倍。而且在使用PyPy时,写数学表达式的最好方式就是最简单的方式。它会比你自己优化得更好,所以尽量让代码简单易读。

13
  1. 如果你在用 Python 2.7,一定要加上 from __future__ import division。这样可以避免很多混淆和错误。

    有了这个,你就不用担心除法的结果是浮点数还是整数了,/ 总是会得到浮点数,而 // 总是会得到整数。

  2. 你应该用 float() 来转换你的输入。这样做只需要一次,而且对性能影响不大。

  3. 我会这样计算一组浮点数的总和:sum(li, 0.0),不过如果需要更高的精度,建议使用 math.fsum,这是专门为此设计的。

  4. 最后,你的最后一句话让我有点困惑。你是想说 1/((N-1)*x) 还是 (1/(N-1))*x?如果是第一种情况,我会写成 1 / (x * (N-1)),而第二种情况则是 x / (N-1)。这两种写法都假设你在用 3.x 版本的除法。

另外,如果你想要更好的性能,可以看看 numpy。

撰写回答