Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加快搜索大字符串中的子字符串_Python - Fatal编程技术网

Python 加快搜索大字符串中的子字符串

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

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

将正文解析为一个
集合
,以便更有效地搜索它

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))用于在每次迭代中创建集合。