2012-06-01 4 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's 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") 
Смежные вопросы