re.match需要很长时间才能完成

时间:2015-04-26 10:36:11

标签: python regex pandas

我是python的新手,编写了以下运行速度非常慢的代码。

我调试了代码并发现它是导致代码运行速度非常慢的最后一个re.match()。即使前一个匹配对同一个DataFrame进行相同类型的匹配,它也会很快恢复。

以下是代码:

My_Cells = pd.read_csv('SomeFile',index_col = 'Gene/Cell Line(row)').T
My_Cells_Others = pd.DataFrame(index=My_Cells.index,columns=[col for col in My_Cells if re.match('.*\sCN$|.*\sMUT$|^bladder$|^blood$|^bone$|^breast$|^CNS$|^GI tract$|^kidney$|^lung$|^other$|^ovary$|^pancreas$|^skin$|^soft tissue$|^thyroid$|^upper aerodigestive$|^uterus$',col)])
My_Cells_Genes = pd.DataFrame(index=My_Cells.index,columns=[col for col in My_Cells if re.match('.*\sCN$|.*\sMUT$|^bladder$|^blood$|^bone$|^breast$|^CNS$|^GI tract$|^kidney$|^lung$|^other$|^ovary$|^pancreas$|^skin$|^soft tissue$|^thyroid$|^upper aerodigestive$|^uterus$',col) is None ])
for col in My_Cells.columns:
   if  re.match('.*\sCN$|.*\sMUT$|^bladder$|^blood$|^bone$|^breast$|^CNS$|^GI tract$|^kidney$|^lung$|^other$|^ovary$|^pancreas$|^skin$|^soft tissue$|^thyroid$|^upper aerodigestive$|^uterus$',col):
          My_Cells_Others [col] = pd.DataFrame(My_Cells[col])
   if  re.match('.*\sCN$|.*\sMUT$|^bladder$|^blood$|^bone$|^breast$|^CNS$|^GI tract$|^kidney$|^lung$|^other$|^ovary$|^pancreas$|^skin$|^soft tissue$|^thyroid$|^upper aerodigestive$|^uterus$',col) is None:
          My_Cells_Genes [col] =  pd.DataFrame(My_Cells[col])

我不认为问题与正则表达式有关。下面的代码仍然运行缓慢。

for col in My_Cells_Others.columns:
    if (col in lst) or col.endswith(' CN') or col.endswith(' MUT'):
          My_Cells_Others [col] = My_Cells[col]
for col in My_Cells_Genes.columns:
    if  not ((col in lst) or col.endswith(' CN') or col.endswith(' MUT')):
        My_Cells_Genes [col] =  My_Cells[col]

1 个答案:

答案 0 :(得分:0)

"不良"设计正则表达式可能会不必要地慢。

我的猜测是.*\sCN*\sMUT结合了匹配的大字符串,使其变慢,因为它会强制您的脚本检查所有可能的组合。

正如@jedwards所说,你可以替换这段代码

if  re.match('.*\sCN$|.*\sMUT$|^bladder$|^blood$|^bone$|^breast$|^CNS$|^GI tract$|^kidney$|^lung$|^other$|^ovary$|^pancreas$|^skin$|^soft tissue$|^thyroid$|^upper aerodigestive$|^uterus$',col):
          My_Cells_Others [col] = pd.DataFrame(My_Cells[col])

with:

lst = ['bladder', 'blood', 'bone', 'breast', 'CNS', 'GI tract', 'kidney', 'lung', 'other', 'ovary', 'pancreas', 'skin',
       'soft tissue', 'thyroid', 'upper aerodigestive', 'uterus']

if (col in lst) or col.endswith(' CN') or col.endswith(' MUT'):
    # Do stuff

或者,如果您出于某种原因要使用re,则将.*\sCN*\sMUT移至正则表达式的末尾可能会帮助,具体取决于您的数据,因为除非真的有必要,否则不会强制检查所有这些组合。