请帮我优化我的Python代码

时间:2010-06-14 12:18:30

标签: python optimization

初学者在这里!请原谅我提出可能是一个非常简单的问题。

我一直在尝试整理一个Python脚本,该脚本在指定的纯文本文件上运行多个查找和替换操作以及一些类似的操作。它有效,但从编程的角度来看,我怀疑它运作良好。我如何才能最好地优化对'outtext'变量所做的操作?目前它基本上做了四次相似的事情......

import binascii
import re
import struct
import sys

infile = sys.argv[1]
charenc = sys.argv[2]
outFile=infile+'.tex'

findreplace = [
('TERM1', 'TERM2'),
('TERM3', 'TERM4'),
('TERM5', 'TERM6'),
]

inF = open(infile,'rb')
s=unicode(inF.read(),charenc)
inF.close()

# THIS IS VERY MESSY.
for couple in findreplace:
    outtext=s.replace(couple[0],couple[1])
    s=outtext

for couple in findreplace:
    outtext=re.compile('Title: (.*)', re.I).sub(r'\\title'+ r'{\1}', s)
    s=outtext

for couple in findreplace:
    outtext=re.compile('Author: (.*)', re.I).sub(r'\\author'+ r'{\1}', s)
    s=outtext

for couple in findreplace:
    outtext=re.compile('Date: (.*)', re.I).sub(r'\\date'+ r'{\1}', s)
    s=outtext
# END MESSY SECTION.

outF = open(outFile,'wb')
outF.write(outtext.encode('utf-8'))
outF.close()

3 个答案:

答案 0 :(得分:4)

对于最后三个替换,for循环似乎是不必要的,因为循环体不使用循环变量。此外,没有必要将结果分配给临时outtext变量,可以将其直接分配给s

这些更改使代码更加简洁:

for couple in findreplace:
    s = s.replace(couple[0],couple[1])

s = re.compile('Title: (.*)', re.I).sub(r'\\title {\1}', s)
s = re.compile('Author: (.*)', re.I).sub(r'\\author {\1}', s)
s = re.compile('Date: (.*)', re.I).sub(r'\\date {\1}', s)

答案 1 :(得分:2)

一些可能性:

  • 在循环外执行re.compile。
  • 只使用一个循环并完成其中的所有四个操作。
  • 使用一个正则表达式,匹配标题,作者或日期。
  • 不要在循环中进行最后三次替换,因为他们不使用couple变量。

答案 2 :(得分:0)

你的代码并不是那么糟糕。如果你想优化速度,那么我会考虑在程序开始时编译你的正则表达式。

此外,如果你想整理你的代码,那么在一个循环中链接所有的潜艇。