我正在执行以下操作:

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秒
  • int除法和乘法: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/

    10-09 07:13