在哪个阶段?

时间:2018-02-01 17:35:08

标签: python rounding

在Python中,应该在什么阶段使用10 * math.log(x) + 10?举个例子:round(10 * math.log(x) + 5) round(10 * math.log(x)) + 5 10 * round(math.log(x)) + 5 如果我希望这个是圆形的,我应该使用它吗?

int()

我的猜测是,早期的舍入会运行得最快,因为整数运算更多,看起来它们应该比浮点更快。如果稍后的值发生变化,舍入似乎不太可能中断。

答案是否与{{1}}相同?

5 个答案:

答案 0 :(得分:2)

不要过早优化。在许多情况下,它的不是高度优化的数学函数会降低程序的速度,但逻辑结构数据计算中使用的类型。

为此,我建议您使用cProfile来识别瓶颈。请注意,cProfile本身具有开销,因此它主要用于相对比较。

根据@ glibdud的评论,您必须了解舍入将如何影响您的计算。尝试一些示例,或执行测试以查看错误在大量输入中的变化情况。

答案 1 :(得分:1)

越早进行四舍五入,你的结果就会越多。在我看来,这一切都取决于你的计划的期望。

至于difference between int() and round(),这个帖子完美地回答了它。

更具体地说明你的性能问题:round()函数,即内置的python,是用C实现的,你不应该真的担心性能,因为它会<强烈的>非常,非常可以忽略不计。

Round function

答案 2 :(得分:1)

这完全取决于您希望如何格式化和解释您的答案。我不会挂在圆形功能的速度上(除非你的程序非常小的性能提升至关重要)。我会考虑通过四舍五入来实现的目标。如果您的目标是生成一个四舍五入到最接近的整数的输出(为简单起见),那么我将整个算术语句包含在round函数中。如果您的目标是仅在日志计算中使用舍入整数(可能因为您不想使用浮点数),那么您应该只舍入math.log(x)函数。没有任何技术原因你可以使用它们,但肯定有一个合乎逻辑的原因,你想要选择任何一个选项。

答案 3 :(得分:1)

请注意,默认情况下,Python Math.log()函数是e的基础。根据你的问题,我们不清楚你期望的基数,所以我假设谷歌的基数为10。为了使它等同于提供的数学函数,代码需要:

import math
#assuming x equals 2
x = 2
function1 = round(10 * math.log(x,10) + 5)
function2 = round(10 * math.log(x,10)) + 5)
function3 = 10 * round(math.log(x,10)) + 5)
function4 = 10*math.log(x,10)+5

print(function1)
print(function2)
print(function3)
print(function4)

现在,假设x = 2,数学方程的计算 8.01029995664 查看上面代码的打印输出:

8
8
5
8.010299956639813

它清楚地表明函数1,2和4大致在数学上等效,函数3不正确。这是因为round函数使用Half and Above规则进行舍入。 Math.log(2,10)得到0.3,所以当圆函数发生时它会降到零。

对于int()和round()的等价,IMCoins引用的链接非常好。求和是int()从数字中删除十进制值,并且该舍入使用一半以上的规则,因此对于小于x.5的任何内容,它将像int()一样。

至于速度问题,如果准确性是不可协商的,最好在答案完成时进行舍入,原因与上面的函数3错误的原因相同。如果你相当肯定你可以在一个步骤安全地回合,那么我同意上面的答案使用CProfile并找到瓶颈

希望这会有所帮助。

答案 4 :(得分:0)

我不知道,但让我们看看:)。

import time
import math

n = 1000000
x = 5

def timeit(f):

    t_0 = time.perf_counter()

    for _ in range(n):
        f()

    t_1 = time.perf_counter()

    print((t_1 - t_0)/ n)        

def fun1():
    round(10 * math.log(x) + 5)

def fun2():
    round(10 * math.log(x)) + 5

def fun3():
    10 * round(math.log(x)) + 5    

[timeit(_) for _ in [fun1, fun2, fun3]] 

在我的电脑上,最后一张比其他电影稍快。