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")
4

4 回答 4

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)
于 2012-06-01T07:19:09.127 回答
1

使用str.translate()而不是艰难地进行所有替换,并逐行进行。

于 2012-06-01T07:17:48.940 回答
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")
于 2012-06-01T08:43:25.953 回答
0

首先,您需要考虑您的算法已经足够好的选项。即使它可以被优化,如果你的代码是一个更大的程序的一部分并且它只在 0.1% 的时间内执行,那么优化代码很可能是无用的,因为程序的其余部分将主导总执行时间。

如果您的代码确实有问题,那么我将从分析您的算法的复杂性开始。

最后,您可以尝试在代码中找到一些瓶颈。为此,我会用 python 的timeit之类的东西来分析代码。

于 2012-06-01T07:34:22.683 回答