优化代码

时间:2011-06-02 14:27:28

标签: python

我是python的新手。我希望所有的python大师都能提出一些方法来使下面的代码更加pythonic,从而提高效率。 它是一个简单的代码,用于查找两个单词之间的编辑距离。

P.S。我想改进代码,而不是逻辑或算法优化。

class test:
    def __init__(self,a,b,I=1,D=1,R=1):
        self.a = a
        self.b = b
        self.mem = dict()
        self.la = len(a)
        self.lb = len(b)
        self.I = I
        self.D = D
        self.R = R

    def diff(self,i=0,j=0):
        T = self.diff
        memo = self.mem
        if j == self.lb: return self.D * i
        if i == self.la: return self.D * j
        if (i,j) in memo:
            return memo[(i,j)]
        if self.a[i] == self.b[j]:
            memo[(i,j)] = T( i+1,j+1 )
            return memo[ (i,j) ]
        memo[(i,j)] = min(self.R + T(i+1,j+1) , self.D + T(i+1,j) , self.I + T(i,j+1) ,
         self.D + T(i,j+1) , self.I + T(i+1,j) )
        return memo[(i,j)]

变量说明:

a,b是要找到edit distance的两个字符串。 I,D,R插入删除和替换单个字母的成本。 mem是用于记忆递归调用的字典。 i和j分别是字符串a和b的指针

3 个答案:

答案 0 :(得分:3)

Pythonic将是:

  1. 写了很多单元测试。
  2. 不要重新发明轮子:在线搜索以前的问题解决方案。见评论。
  3. 不要过早优化:分析您的代码以确定是否真的如此  瓶颈,如果它是改进算法。
  4. 有意义的变量名称
  5. 不要使用大写字母
  6. 启动本地变量名称
  7. 在括号T(i+1, j+1)而不是T( i+1,j+1 )
  8. 中使用普通空格
  9. 不要使用虚假括号圆形元组:memo[i,j]而非memo[(i,j)]
  10. 不要过早优化:self.diff(i+1, j+1)而非T(i+1,j+1)

答案 1 :(得分:1)

我认为代码非常pythonic,但正如评论中所述,选择通用单字母变量字是一个非常糟糕的主意,并且使代码很难理解,而且这不是pythonic。

这适用于每种编程语言,但在某些情况下,在python和其他dynamically typed languages中更是如此。

尝试用变量名称真正慷慨和描述。

请参阅网站创建者博客中的example(在“编码恐怖”的含义下?“)。

答案 2 :(得分:1)

您可能需要考虑将{00}}的行中的memoization图层分解出来。