Python round() 太慢,更快的方法来降低精度?

标签 python

我正在做以下事情:

TOLERANCE = 13
some_float = ...
round(some_float, TOLERANCE)

这是多次运行,所以性能很重要。由于浮点表示错误,我必须舍入 some_float。从这个意义上说,我实际上不需要对数字进行“四舍五入”,只需删除 13 个尾随数字后的数字即可。

有没有更快的方法来做到这一点?

最佳答案

我做了一些长凳来比较 round(some_float, TOLERANCE)int(some_float * p + 0.5)/p (p 为 10 **TOLERANCE) 结果如下:

  • 一轮:6.20秒
  • 整数除法+乘法:3.53

我的长凳:

import time


TOLERANCE = 5
some_float = 12.2439924563634564564564
nb_loops = 10000000

start_time = time.time()
for _ in range(nb_loops):
    r1 = round(some_float, TOLERANCE)
print(r1,time.time()-start_time)

start_time = time.time()
p = float(10**TOLERANCE)
for _ in range(nb_loops):
    r2 = int(some_float * p + 0.5)/p
print(r2,time.time()-start_time)

结果:

12.24399 6.208600997924805
12.24399 3.525486946105957

所以 int 解决方案更快。 round 可能更好地处理负数的舍入(正如有人评论的那样,它进行了很多额外的调用,因此代码更复杂)。根据输入数字的符号,四舍五入可能会有所不同。精度与原始速度,再次。

添加 0.5 或不进行舍入或截断。这对你来说似乎是一个细节,但 int 解决方案(假设 10**TOLERANCE 是预先计算的)似乎更快。

如果您想使用该技术,您可能会想将舍入代码放在一个函数中:

TOLERANCE = 5
p = float(10**TOLERANCE)
def my_round_5(some_float):
    return int(some_float * p + 0.5)/p

并这样调用它:

r2 = my_round(some_float)

这仍然比 round 快,但比使用内联公式慢一点(因为函数调用不是免费的)

请注意,我使用的是 p = float(10**TOLERANCE) 而不是 p = 10**TOLERANCE 因此该代码与 python 2 兼容(否则由于整数除法,它会截断小数部分)

关于Python round() 太慢,更快的方法来降低精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920655/

相关文章:

类实例与局部(numpy)变量的 Python 性能

python - 用参数OpenCV Python发送带有颜色的矩形时出错

python - Python中的for循环

python - kivy中列表项按钮的unicode字符错误

python - Django self.cleaned_data Keyerror

python - 将 np.int8 数组与 127 相乘会根据平台产生不同的 numpy 数组类型

python - 将原始数字写入磁盘

python - 在没有嵌套循环的情况下访问字典的嵌套级别

python - Python 中的方法重载 : more overloading

python - 在 heroku python 教程中,virtualenv 问题安装 wsgiref(ez_setup 语法错误?)