2012-06-01 63 views
0

這個程序是python中的一個基本編碼器,我想知道是否可以在不更改定義變量的名稱的情況下使其更高效。有人可以給我一些建議嗎?我該如何讓這個程序更高效

def encode(pattern, filename): 
    f = open(filename, "rt") 
    contents = f.read() 
    f.close() 
    printNow(contents) 

    changes = pattern.split("|") 
    for str in changes: 
    printNow("Change "+ str[0] + " to " + str[1]) 

    newMsg = "" 
    for char in contents: 
    for change in changes: 
     if char == change [0]: 
     char = change[1] 
    newMsg += char 



    f = open(filename + "encoded", "wt") 
    f.write(newMsg) 
    f.close() 

    f = open(filename + "encoded", "rt") 
    printNow(f.read()) 
    f.close() 

encode("ae|ga|s3", "C:\\Users\\Shaun\\Desktop\\Test.txt") 
+1

你可以通過測量它,並告訴我們啓動它的表現不如你認爲的那樣。 – Jordan

+0

更高效的是什麼意思?你必須更具體。效率的定義因人而異,是執行時間,還是內存消耗,或輸出? – Zeina

回答

1

使用str.translate()而不是以困難的方式完成所有的替換,並逐行進行。

3
import string 


def encode(pattern, filename): 
    with open(filename) as f: 
     contents = f.read() 
    s = string.maketrans(*[''.join(a) for a in zip(*pattern.split('|'))]) 
    newMsg = contents.translate(s) 
    with open(filename + 'encoded', 'rt') as f: 
     f.write(newMsg) 
0

首先,您需要考慮您的算法已經足夠好的選項。即使它可以被優化,如果你的代碼是一個更大的程序的一部分,並且它只在0.1%的時間內執行,例如,那麼對代碼進行優化可能是沒有用的,因爲程序的其餘部分將主宰總執行時間。

如果您的代碼確實存在問題,那麼我將首先分析您的算法的complexity

最後,您可以嘗試在代碼中找到一些瓶頸。爲此,我會用類似python的timeit來分析代碼。

0

()方法可以很好地用於字符替換,但這裏的str.translate是另一種快速的方法,我使用的方法也適用於多字符替換:

import re 

def encode(pattern, filename): 
    f = open(filename, "rt") 
    contents = f.read() 
    f.close() 
    printNow(contents) 

    change_dict = {} 
    matches = [] 
    changes = pattern.split("|") 
    for str in changes: 
    printNow("Change "+ str[0] + " to " + str[1]) 
    change_dict[str[0]] = str[1] 
    matches.append(str[0]) 

    change_re = re.compile("|".join(re.escape(x) for x in matches)) 

    newMsg = change_re.sub(lambda m: change_dict[m.group(0)], contents) 

    f = open(filename + "encoded", "wt") 
    f.write(newMsg) 
    f.close() 

    f = open(filename + "encoded", "rt") 
    printNow(f.read()) 
    f.close() 

encode("ae|ga|s3", "C:\\Users\\Shaun\\Desktop\\Test.txt")