2011-06-02 212 views
2

我是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是用於記憶遞歸調用的字典。 我和j分別是字符串a和b的指針

+5

這是否正常工作?也許對於codereview.SE? – Trufa 2011-06-02 14:30:09

+0

它完美的工作。自從我學習python以來,我只是想讓它變得更加「pythonic」。 – elricL 2011-06-02 14:32:05

+0

是'def()'應該是一個實例方法?如果是這樣,它不是正確縮進。如果沒有,使用'self'作爲第一個參數是...奇怪。 – geoffspear 2011-06-02 14:32:56

回答

3

Python的將是:

  1. 編寫大量的單元測試。
  2. 不要重新發明輪子:在線搜索以前的解決方案。查看評論。
  3. 不要過早優化:分析您的代碼以確定這是否確實是瓶頸,是否會改進算法。
  4. 有意義的變量名
  5. 切勿啓動大寫字母
  6. 使用正常空白括號內T(i+1, j+1)T(i+1,j+1)
  7. 不要使用虛假的括號一輪元組局部變量名:memo[i,j]memo[(i,j)]
  8. 別t過早優化:self.diff(i+1, j+1)不是T(i+1,j+1)
1

我認爲代碼是pythonic,但正如註釋中所述,選擇通用單字母變量單詞並呈現您的代碼很難理解,這不是pythonic。

這適用於每種編程語言,但在某些情況下更適用於python和其他dynamically typed languages

試着變得非常慷慨和描述變量名稱。

查看這個網站創建者博客example(在「編碼恐怖」的含義是什麼?

1

您可能想要考慮將您的班級中的記憶層劃分爲this decorator

+0

真的很喜歡這個。 – elricL 2011-06-02 15:00:16