2016-02-23 87 views
-2

我有以下一段代码不符合我的要求。如何提高此算法的效率?

def cipher(plaintext, arr): 
    import math 
    ciphered = [] 
    for letter in plaintext: 
     ciphered.append(math.pow(ord(letter)-65,arr[1]%arr[0])) 
    return ciphered 

那些获得到math.pow的参数是142和35。然后,它使用的是结果找到模块221然而,结果它给我的是206.0当结果,它应该给我是12.即使当我在wolfram alpha中找到这个结果时,结果是12.我认为这里的问题与溢出问题有关。但是我不知道如何解决它

+0

给我们一些'plaintext'和'arr'的样本值,以及期望的输出。 –

+0

提高效率并没有给你正确的答案是两件不同的事情。一般来说,程序员会告诉你先让它工作,然后优化算法......无论如何,只要提高它的效率,要考虑的一件事就是取消调用导入数学的操作。导入一个库需要很多时间;如果你需要调用500,000次这样的函数,那将是非常低效的。相反,你可以在函数中使用Python中原生的简单操作和对象来实现你想要的功能..无论如何应该让你开始 –

+2

其中一个结束括号应该在'%arr [0]'之前,而不是之后。或者你可以用''替换'%',以使用快速模幂运算。 –

回答

2

你正在尝试建立被称为模幂,并且有一个优化的算法,这将避免精度损失,并随后不正确的结果:

def pow_mod(b, e, m): 
    """Compute (b^e) mod m.""" 
    c, e_ = 1, 0 
    while e_ < e: 
     e_ += 1 
     c = (b*c) % m 
    return c 

编辑(谢谢,@ user2357112): ...或者你可以使用内置的pow,这已经做到了。但是,当你问及如何提高效率时,就是这样。

+2

这已经与Python;当你给它3个参数时,它是内建的'pow'(而不是特定的浮点'math.pow')。 – user2357112

+0

@ user2357112 TIL – L3viathan