在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}}相同?
答案 0 :(得分:2)
不要过早优化。在许多情况下,它的不是高度优化的数学函数会降低程序的速度,但逻辑,结构或数据计算中使用的类型。
为此,我建议您使用cProfile来识别瓶颈。请注意,cProfile本身具有开销,因此它主要用于相对比较。
根据@ glibdud的评论,您必须了解舍入将如何影响您的计算。尝试一些示例,或执行测试以查看错误在大量输入中的变化情况。
答案 1 :(得分:1)
越早进行四舍五入,你的结果就会越多。在我看来,这一切都取决于你的计划的期望。
至于difference between int() and round(),这个帖子完美地回答了它。
更具体地说明你的性能问题:round()
函数,即内置的python,是用C实现的,你不应该真的担心性能,因为它会<强烈的>非常,非常可以忽略不计。
答案 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]]
在我的电脑上,最后一张比其他电影稍快。