我是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]
答案 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
移至正则表达式的末尾可能会帮助,具体取决于您的数据,因为除非真的有必要,否则不会强制检查所有这些组合。