我正在执行以下操作:
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)
,这是结果:
我的板凳:
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/