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

まず最初に、アルゴリズムがすでに十分に優れているというオプションを検討する必要があります。最適化できたとしても、コードがより大きなプログラムの一部であり、たとえば0.1%の時間しか実行されない場合、プログラムの残りの部分が支配的であるため、コードを最適化することはおそらく役に立たないでしょう。合計実行時間。

コードに本当に問題がある場合は、アルゴリズムの複雑さを分析することから始めます。

そして最後に、コードのボトルネックを見つけようとすることができます。そのために、Pythonのtimeitのようなものでコードをプロファイリングします。

于 2012-06-01T07:34:22.683 に答える
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 に答える