精简try-except+;用于在Python中加快处理速度的if语句

精简try-except+;用于在Python中加快处理速度的if语句,python,loops,if-statement,iterator,try-except,Python,Loops,If Statement,Iterator,Try Except,我在目录中的一堆文件中使用正则表达式处理字符串。对于文件中的每一行,我应用一系列try语句来匹配模式,如果它们匹配,则转换输入。分析完每一行后,我将其写入一个新文件。我有很多这样的try-else语句,后面是if语句(我这里只包括两个作为示例)。我这里的问题是,在处理了几个文件之后,脚本的速度会减慢很多,以至于几乎完全停止了处理过程。我不知道我的代码中是什么导致了速度变慢,但我感觉这是try-else+if语句的组合。如何简化转换,以便以合理的速度处理数据 还是我需要一个更高效的迭代器,它不会对

我在目录中的一堆文件中使用正则表达式处理字符串。对于文件中的每一行,我应用一系列try语句来匹配模式,如果它们匹配,则转换输入。分析完每一行后,我将其写入一个新文件。我有很多这样的try-else语句,后面是if语句(我这里只包括两个作为示例)。我这里的问题是,在处理了几个文件之后,脚本的速度会减慢很多,以至于几乎完全停止了处理过程。我不知道我的代码中是什么导致了速度变慢,但我感觉这是try-else+if语句的组合。如何简化转换,以便以合理的速度处理数据

还是我需要一个更高效的迭代器,它不会对内存造成同样程度的负担

任何反馈都将不胜感激

import re
import glob

fileCounter = 0 

for infile in glob.iglob(r'\input-files\*.txt'):

    fileCounter += 1
    outfile = r'\output-files\output_%s.txt' % fileCounter

    with open(infile, "rb") as inList, open(outfile, "wb") as outlist:

        for inline in inlist:

            inword = inline.strip('\r\n')

            #apply some text transformations
            #Transformation #1
            try: result = re.match('^[AEIOUYaeiouy]([bcćdfghjklłmnńprsśtwzżź]|rz|sz|cz|dz|dż|dź|ch)[aąeęioóuy](.*\[=\].*)*', inword).group()
            except: result = None

            if result == inword:
                inword = re.sub('(?<=^[AEIOUYaeiouy])(?=([bcćdfghjklłmnńprsśtwzżź]|rz|sz|cz|dz|dż|dź|ch)[aąeęioóuy])', '[=]', wbWord)

            #Transformation #2 etc.
            try: result = re.match('(.*\[=\].*)*(\w?\w?)[AEIOUYaąeęioóuy]\[=\][ćsśz][ptkbdg][aąeęioóuyrfw](.*\[=\].*)*', inword).group()
            except: result = None

            if result == inword:   
                inword =  re.sub('(?<=[AEIOUYaąeęioóuy])\[=\](?=[ćsśz][ptkbdg][aąeęioóuyrfw])', '', inword)
                inword =  re.sub('(?<=[AEIOUYaąeęioóuy][ćsśz])(?=[ptkbdg][aąeęioóuyrfw])', '[=]', inword)

            outline = inword + "\n"
            outlist.write(outline)

    print "Processed file number %s" % fileCounter          
print "*** Processing completed ***" 
重新导入
导入glob
fileCounter=0
对于glob.iglob(r'\input files\*.txt')中的填充:
fileCounter+=1
outfile=r'\output files\output\uu%s.txt“%fileCounter”
以open(infle,“rb”)作为内列表,open(outfile,“wb”)作为大纲视图:
对于inline-in-inlist:
inword=inline.strip('\r\n')
#应用一些文本转换
#转变#1
try:result=re.match('^[aeiouyaeouy]([bcćdfghjklłmnŇprsśtwzż378;])(rz|sz|cz|dz|dӠch)[aąeęioóuy](\[=\[\].*),换句话说)。group()
除外:结果=无
如果结果==inword:

inword=re.sub(“(?try/except)确实不是测试
re.match()
结果的最有效的方法(也不是最可读的方法),但是惩罚命中率仍然应该是(或多或少)恒定的-在执行期间性能不应该降低(直到可能由于您的数据而出现最坏的情况)-所以问题可能在别处

FWIW您可以首先用适当的规范解决方案替换try/except块,即代替:

try:
    result = re.match(someexp, yourline).group()
except:
    result = None
你想要:

match = re.match(someexp, yourline)
result = match.group() if match else None
这将略微提高性能,但最重要的是,使代码更具可读性和可维护性-至少不会隐藏任何意外的错误

作为旁注,从不使用一个裸except子句,始终只捕获预期的异常(这里是一个
AttributeError
,因为
re.match()
在没有匹配的情况下返回
None
,并且
None
当然没有属性


这很可能解决不了你的问题,但至少你会知道问题在别处。

谢谢你的建议,布鲁诺。这很有帮助!