簡體   English   中英

如何加速Python字符串匹配代碼

[英]How to speed up Python string matching code

我有這個代碼,它計算隨機字符串之間的最長公共子序列,以查看一個人可以重建輸入的未知區域的准確程度。 為了得到好的統計數據,我需要多次迭代它,但我目前的python實現太慢了。 即使使用pypy,它目前需要21秒才能運行一次,我理想情況下要運行它100次。

#!/usr/bin/python

import random
import itertools
#test to see how many different unknowns are compatible with a set of LCS answers.
def lcs(x, y):
    n = len(x)
    m = len(y)
#    table is the dynamic programming table
    table = [list(itertools.repeat(0, n+1)) for _ in xrange(m+1)]
    for i in range(n+1):     # i=0,1,...,n
        for j in range(m+1):  # j=0,1,...,m
            if i == 0 or j == 0:
                table[i][j] = 0
            elif x[i-1] == y[j-1]:
                table[i][j] = table[i-1][j-1] + 1
            else:
                table[i][j] = max(table[i-1][j], table[i][j-1])

    # Now, table[n, m] is the length of LCS of x and y.
    return table[n][m]

def lcses(pattern, text):
    return [lcs(pattern, text[i:i+2*l]) for i in xrange(0,l)]

l = 15
#Create the pattern
pattern = [random.choice('01') for i in xrange(2*l)]

#create text start and end and unknown. 
start = [random.choice('01') for i in xrange(l)]
end = [random.choice('01') for i in xrange(l)]
unknown = [random.choice('01') for i in xrange(l)]

lcslist= lcses(pattern, start+unknown+end)

count = 0
for test in itertools.product('01',repeat = l):
    test=list(test)
    testlist = lcses(pattern, start+test+end)
    if (testlist == lcslist):
        count += 1

print count

我嘗試將它轉換為numpy但我必須做得很糟糕,因為它實際上運行得更慢。 這個代碼能以某種方式加速嗎?

更新。 在下面的評論之后,如果lcses直接使用了一個遞歸會更好,它會在pattern和所有相同長度的text子列表之間產生LCS。 有可能以某種方式修改經典動態編程LCS算法嗎?

當每次調用lcses()時,重復計算table重新計算15次,當它僅依賴於mn ,其中m的最大值為2*ln最多為3*l

如果你的程序只計算一次表,那么它將是當前不是動態編程。 這個Python的習語是

table = None
def use_lcs_table(m, n, l):
    global table
    if table is None:
        table = lcs(2*l, 3*l)
    return table[m][n]

除了使用類實例之外,它比全局表聲明更清晰,更可擴展。 但這讓你知道為什么花了這么多時間。

添加回復評論:

動態編程是一種優化,需要在更短的時間內權衡額外的空間。 在您的示例中,您似乎在lcs()執行表預計算,但是您在每次調用時都會構建整個列表,然后將其丟棄。 我沒有聲稱要了解您嘗試實現的算法,但是您對其編碼的方式如下:

  1. 沒有遞歸關系,因此沒有理由進行DP優化,或者
  2. 有一個遞歸關系,你搞砸了它的實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM