加快大字符串内子串的搜索速度

时间:2018-01-15 10:05:57

标签: python

我编写了以下python代码片段,它实际上发现字符串中是否存在特定的子字符串。由于环路运行大约1000次,完成需要大约5-7秒。

for style in all_available_gs_styles:
     if style.sld_title is not None:
       if str(style.sld_title) not in ('line', 'point', 'polygon', 'Polygon', 'Default Line', 'Default Point'):
         if 'PolygonSymbolizer' in style.sld_body and layer_geom == 'polygon':
            gs_styles.append((style.name, style.sld_title))
         elif 'LineSymbolizer' in style.sld_body and layer_geom == 'line':
            gs_styles.append((style.name, style.sld_title))
         elif 'PointSymbolizer' in style.sld_body and layer_geom == 'point':
            gs_styles.append((style.name, style.sld_title))

我想知道是否有更有效的方法来搜索大约50行长的文本中的字符串。什么是更快的方法?

修改 根据接受的答案,执行时间减少到4-5秒。仍然不够,但比以前更好。

2 个答案:

答案 0 :(得分:2)

我会选择更紧凑但仍然可读的东西:

geoms   = ('line', 'point', 'polygon')  # see EDIT
invalid = {'line', 'point', 'polygon', 'Polygon', 'Default Line', 'Default Point'}
for style in all_available_gs_styles:
    if style.sld_title and str(style.sld_title) not in invalid:
        if any(layer_geom == x and '{}Symbolizer'.format(x.capitalize()) in style.sld_body for x in geoms):
            gs_styles.append((style.name, style.sld_title))

请注意,增益只是有条件的:

首先检查等同性检查是因为它更快是正确的方法它只会在它返回False的情况下有所帮助。

您的代码(以及我的代码)中的瓶颈是这些 in 检查(if 'PolygonSymbolizer' in style.sld_body),但在不知道您正在使用的数据的情况下,我无法继续提供帮助。< / p>

修改

使用Euler's formula for polyhedra我们可以假设对于每个多边形,行数(E)将大于顶点数(V),因此,{{1}中最常见的实体}。我们可以通过重新安排像style.sld_body之类的any元组来利用这一点来使geom短路更频繁。这当然不会产生重大影响,但这是我们能做的最好的事情。

答案 1 :(得分:1)

将身体解析为set,以便您可以更有效地搜索它。

for style in all_available_gs_styles:
     if style.sld_title is not None:
       if str(style.sld_title) not in ('line', 'point', 'polygon', 'Polygon', 'Default Line', 'Default Point'):
         body_words = set(style.sld_body.split(' '))
         if 'PolygonSymbolizer' in body_words and layer_geom == 'polygon':
            gs_styles.append((style.name, style.sld_title))
         elif 'LineSymbolizer' in body_words and layer_geom == 'line':
            gs_styles.append((style.name, style.sld_title))
         elif 'PointSymbolizer' in body_words and layer_geom == 'point':
            gs_styles.append((style.name, style.sld_title))