我编写了以下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秒。仍然不够,但比以前更好。
答案 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))