我正在学习 Python,我必须编写一个生成日志结果的脚本。
我知道日志基数 x = 结果
然后我做了我的代码。
def log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
print log_b
return int(round(log_b))
但它的工作非常缓慢。我可以使用其他方法吗?谢谢!
我正在学习 Python,我必须编写一个生成日志结果的脚本。
我知道日志基数 x = 结果
然后我做了我的代码。
def log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
print log_b
return int(round(log_b))
但它的工作非常缓慢。我可以使用其他方法吗?谢谢!
您可能要考虑的另一件事是使用自然对数的泰勒级数:
一旦您使用本系列中的一些术语来近似自然对数,就很容易更改基数:
编辑:这是另一个有用的身份:
使用它,我们可以写一些类似的东西
def ln(x):
n = 1000.0
return n * ((x ** (1/n)) - 1)
测试一下,我们有:
print ln(math.e), math.log(math.e)
print ln(0.5), math.log(0.5)
print ln(100.0), math.log(100.0)
输出:
1.00050016671 1.0
-0.692907009547 -0.69314718056
4.6157902784 4.60517018599
这显示了我们的值与math.log
值(由空格分隔)的比较,并且如您所见,我们非常准确。当你变得非常大时,你可能会开始失去一些准确性(例如ln(10000)
,会比它应该的更大),但如果你需要,0.4
你总是可以增加。n
我使用递归:
def myLog(x, b):
if x < b:
return 0
return 1 + myLog(x/b, b)
您可以为此使用二进制搜索。您可以获取有关二分搜索的更多信息http://en.wikipedia.org/wiki/Binary_search_algorithm;
基本上你从 0 和 x 开始并应用算法。我会在一分钟内为你写一些代码。
def log(x, base, mn, mx):
if (mn <= mx):
med = (mn + mx) / 2.0
if x == int(round(base ** med)):
return int(round(log_b))
if x > int(round(base ** med)):
return log(x, base, med, mx)
if x < int(round(base ** med)):
return log(x, base, mn, med)
return 0
类似的东西。
import math
try :
number_and_base = input() ##input the values for number and base
##assigning those values for the variables
number = int(number_and_base.split()[0])
base = int(number_and_base.split()[1])
##exception handling
except ValueError :
print ("Invalid input...!")
##program
else:
n1 = 1 ##taking an initial value to iterate
while(number >= int(round(base**(n1),0))) : ##finding the most similer value to the number given, varying the vlaue of the power
n1 += 0.000001 ##increasing the initial value bit by bit
n2 = n1-0.0001
if abs(number-base**(n2)) < abs(base**(n1)-number) :
n = n2
else :
n = n1
print(math.floor(n)) ##output value
比较:-
这就是您的日志的工作方式:-
def your_log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
#print log_b
return int(round(log_b))
print your_log(16, 2)
# %timeit %run your_log.py
# 1000 loops, best of 3: 579 us per loop
这是我提出的改进:-
def my_log(x, base):
count = -1
while x > 0:
x /= base
count += 1
if x == 0:
return count
print my_log(16, 2)
# %timeit %run my_log.py
# 1000 loops, best of 3: 321 us per loop
这更快,使用%timeit
iPython 中的魔术函数来计算执行时间以进行比较。
这将是一个漫长的过程,因为它会进入一个循环。所以,
def log(x,base):
result = ln(x)/ln(base)
return result
def ln(x):
val = x
return 99999999*(x**(1/99999999)-1)
log(8,3)
值几乎相等但不精确。