在Python中编写简单数学计算的最佳实践

时间:2011-12-30 10:19:18

标签: math coding-style python python-2.7

我需要在Python 2.7中进行简单的数学计算,包括求和,减法,除法,乘法,数字列表之和等等。

我想写出优雅,防弹,高效的代码,但我必须承认我对几件事情感到困惑,例如:

  • 如果我的等式中有1/(N-1)*x我应该只编码1/(N-1)*x1.0/(N-1)*x1.0/(N-1.0)*x或其他任何组合?
  • 对于除法,我应该//使用/还是from __future__ import division使用math.fsum()
  • 有哪些做法,例如“使用float(x)连接浮动列表”?
  • 我应该假设输入数字是浮点数还是进行转换以防万一(可能会导致许多{{1}}操作的效率下降)?

那么在Python中编写用于简单数学计算的代码的最佳实践是

  1. 优雅/ Python化,
  2. 高效,
  3. 防止输入数据的确切数字类型(浮点数与整数)不确定性等问题?

2 个答案:

答案 0 :(得分: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风格分裂。

  5. 另外,如果你想要一些真正的表现,请看看numpy。

答案 1 :(得分:2)

如果你想在Python中使用数字代码,那么你应该考虑使用PyPy。 Numpy和scipy对于处理数组很方便,如果你使用它们提供的线性代数算法,它们会提供良好的性能。但是如果你的数值运算是在纯Python代码中,那么PyPy可以显着提高性能。我看到加速比20倍以上。当你使用PyPy时,编写数学表达式的最佳方法是最简单的方法。它会比你更好地优化你的代码,所以尽量使它简单易读。