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

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

我想编写优雅、健壮且高效的代码,但我必须承认,有些事情让我感到困惑,例如:

  • 如果方程中有1/(N-1)*x,我应该只编写1/(N-1)*x,或者可能是1.0/(N-1)*x1.0/(N-1.0)*x或其他任何组合吗?
  • 对于除法,我应该使用//还是/以及from __future__ import division
  • 有哪些最佳实践,比如“使用math.fsum()连接浮点数列表”?
  • 我应该假定输入的数字为浮点数,还是为了安全起见进行转换(可能会冒多次使用float(x)的效率风险)?

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

  1. 优雅/符合Python特色,
  2. 高效,
  3. 对于输入数据的确切数字类型(浮点数与整数)的不确定性等问题具有鲁棒性?

1
我会使用 x/(N-1.0) - 一个浮点数就足以污染所有内容,并且可以减少一个无用的操作 (*1.0)。你永远不会在非整数除法中使用 // - Amadan
2个回答

13
  1. 如果你使用Python 2.7,请一定使用from __future__ import division。它可以消除很多混乱和错误。

    使用此功能,您永远不必担心除法是否为浮点数,/始终是浮点数,//始终是整数。

  2. 你应该使用float()将输入转换为浮点数。只需要转换一次,不会影响性能。

  3. 如果需要精确度,请使用math.fsum来计算一组浮点数的总和:sum(li, 0.0)

  4. 最后,您的最终语句很令人困惑。您是指1/((N-1)*x)还是(1/(N-1))*x?如第一个情况,我会将其写成1 / (x * (N-1));如第二个情况,我会将其写成x / (N-1)。两者都假设使用3.x样式的除法。

另外,如果您想获得真正的性能,请考虑使用numpy。


实际上我指的是 (1 / (N-1)) * x。我没有将其写成 x / (N-1),因为它是某个更大方程的泛化形式,其中 x 是更复杂的东西,这样写更清晰一些;-) - jan
+1 代表着赞,是对numpy库的肯定。如果您热爱数学,可以同时安装scipy和matplotlib库。 - yurisich

2
如果你希望在Python中获得出色的数值代码性能,你应该考虑使用PyPy。Numpy和scipy对于处理数组很方便,并且如果你使用它们提供的线性代数算法,则会获得良好的性能。但是,如果你的数值操作是纯Python代码,PyPy可以显著提高性能。我曾见过20倍以上的加速效果。而当你使用PyPy时,编写数学表达式的最佳方式是简单的方法。这将优化你的代码,比你自己能做得更好,所以尽可能让它简单易读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接