我正在做以下事情:
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/