【问题标题】:Please help me optimize my Python code请帮我优化我的 Python 代码
【发布时间】:2010-06-14 20:30:40
【问题描述】:

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

我一直在尝试编写一个 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()

【问题讨论】:

标签: python optimization


【解决方案1】:

对于最后三个替换,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)

【讨论】:

    【解决方案2】:

    一些可能性:

    • 在循环外重新编译。
    • 仅使用一个循环并在其中执行所有四件事。
    • 使用一个匹配标题、作者或日期的正则表达式。
    • 不要在循环中执行最后三个替换,因为它们不使用 couple 变量。

    【讨论】:

    • 我会给你一个+1,除了最后一个“使用一个正则表达式......”这是个坏建议,正则表达式足够复杂,可以维护,不会无缘无故地让它们变得更加复杂。跨度>
    • 但在这种情况下,这将是一个非常简单的正则表达式,所以我要 +1。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多