Python 加快搜索大字符串中的子字符串
我编写了下面的python代码片段,它实际查找字符串中是否存在特定的子字符串。由于循环大约运行1000次,因此需要大约5-7秒才能完成Python 加快搜索大字符串中的子字符串,python,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 Poin
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秒。仍然不够,但比以前更好。将正文解析为一个
集合
,以便更有效地搜索它
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))
将主体解析为一个
集合
,以便更高效地搜索它
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
的情况下才有帮助
您(和我)的代码中的瓶颈是中的检查(如果style.sld_body中的'PolygonSymbolizer'
),但在不知道您使用的数据的情况下,我无法进一步帮助您
编辑
使用我们可以假设,对于每个多边形,线条数(E)将大于顶点数(V),因此,style.sld_body
中最常见的实体。我们可以利用这一点,通过像geom=('line','point','polygon')那样重新排列geom
元组,使any
短路更频繁。这当然不会产生重大影响,但这是我们所能做的最好的事情。我会选择一些更紧凑但仍相当可读的内容,如:
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
的情况下才有帮助
您(和我)的代码中的瓶颈是中的检查(如果style.sld_body中的'PolygonSymbolizer'
),但在不知道您使用的数据的情况下,我无法进一步帮助您
编辑
使用我们可以假设,对于每个多边形,线条数(E)将大于顶点数(V),因此,style.sld_body
中最常见的实体。我们可以利用这一点,通过像geom=('line','point','polygon')那样重新排列geom
元组,使any
短路更频繁。这当然不会产生重大影响,但这是我们能做的最好的事情。您应该修复压痕。此代码将不会运行。交换测试顺序可能会更快-字符串比较(例如layer\u geom==“polygon
)可能比测试中的更快,特别是取决于style.sld\u body
的大小。让它早点失败可以加快速度。由于这3个内部if
语句都执行相同的操作,因此如果您可以对false
状态进行一次测试,并且在这些情况下不执行任何操作,则速度可能会更快。可能不会影响速度,但是如果style.sld\u title不是None:
则应该将替换为如果style.sld\u title:
则内部如果
没有实际意义。不管怎样,都会执行相同的命令,这样您就可以合并条件。您可能应该在样式中的if.sld\u body
条件之前而不是之后有layer\u gem=
条件,因为检查相等性会更快。@user1919查看我上次的编辑。也许这有点帮助。你应该修正你的缩进。此代码将不会运行。交换测试顺序可能会更快-字符串比较(例如layer\u geom==“polygon
)可能比测试中的更快,特别是取决于style.sld\u body
的大小。让它早点失败可以加快速度。由于这3个内部if
语句都执行相同的操作,因此如果您可以对false
状态进行一次测试,并且在这些情况下不执行任何操作,则速度可能会更快。可能不会影响速度,但是如果style.sld\u title不是None:
则应该将替换为如果style.sld\u title:
则内部如果
没有实际意义。不管怎样,都会执行相同的命令,这样您就可以合并条件。您可能应该在样式中的if.sld\u body
条件之前而不是之后有layer\u gem=
条件,因为检查相等性会更快。@user1919查看我上次的编辑。也许这有点帮助。如果将外部的元组if check转换为一个集合(在循环之前创建一次)(和geom
在每次迭代中也是相同的),你可能会得到一点加速。我认为集合
只有在循环外部创建时才有意义,否则你仍然有O(n)(好吧,O(6))在每次迭代中创建集合。如果检查将外部的元组转换为一个集合(在循环之前创建一次)(和geom
在每次迭代中也是相同的),则可能会得到一点加速。我认为集合只有在循环外部创建时才有意义,否则仍然有O(n)(好吧,O(6))用于在每次迭代中创建集合。