如何使这个程序更有效率

时间:2012-06-01 07:14:15

标签: python

这个程序是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 个答案:

答案 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")