这个程序是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")
答案 0 :(得分: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)
答案 1 :(得分:1)
使用str.translate()
而不是艰难地进行所有替换,并逐行进行。
答案 2 :(得分:0)
首先,您需要考虑您的算法已经足够好的选项。即使它可以被优化,如果你的代码是一个更大的程序的一部分,并且它只在0.1%的时间内执行,那么它最有可能无法优化代码,因为程序的其余部分将主导总执行时间。
如果您的代码确实存在问题,那么我首先要分析算法的complexity。
最后,您可以尝试在代码中找到一些瓶颈。为此,我会用python的timeit。
来描述代码答案 3 :(得分: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")