加速搜索大字符串中的子字符串

2024-05-13 18:55:25 发布

您现在位置: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秒。仍然不够,但比以前好多了。你知道吗


Tags: and字符串nameingslayeriftitle
2条回答

将主体解析为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))

我会用一些更简洁但仍然相当可读的东西,比如:

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),但是如果不知道你正在使用的数据,我就无能为力了。你知道吗


编辑

使用Euler's formula for polyhedra我们可以假设,对于每个多边形,线的数量(E)将大于顶点的数量(V),因此,style.sld_body中最常见的实体。我们可以利用这一点,通过像geoms = ('line', 'point', 'polygon')那样重新排列geom元组,使any短路更频繁。这当然不会产生重大影响,但这是我们所能做的最好的。你知道吗

相关问题 更多 >