Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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/0/performance/5.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 for/in/if列表的理解速度非常慢,匹配的数量很多_Python_Performance_List_List Comprehension - Fatal编程技术网

Python for/in/if列表的理解速度非常慢,匹配的数量很多

Python for/in/if列表的理解速度非常慢,匹配的数量很多,python,performance,list,list-comprehension,Python,Performance,List,List Comprehension,在我的Python 2.7代码中,我有以下列表理解,它返回行号(索引)和一长串行中的行: results = [[lines.index(line), line] for line in lines if search_item in line.lower()] 如果结果数量很低,这是非常快的: The search item is: [ 1330 ] Before string pre-processing, the time is: 0.0000 The numbe

在我的Python 2.7代码中,我有以下列表理解,它返回行号(索引)和一长串行中的行:

results = [[lines.index(line), line] for line in lines
            if search_item in line.lower()]
如果结果数量很低,这是非常快的:

The search item is: [ 1330 ]
Before string pre-processing, the time is: 0.0000
The number of lines is: 1,028,952
After string pre-processing, the time is: 0.2500
The number of results is: 249
“字符串预处理”就是我所说的上面的results=操作

以下是相同的操作,但搜索项为“1330”,而不是“1330”。这一次生成6049个匹配项,而不是249个:

The search item is: [1330]
Before string pre-processing, the time is: 0.0000
The number of lines is: 1,028,952
After string pre-processing, the time is: 10.3180
The number of results is: 6,049
如你所见,10秒对1/4秒。。。此外,“1330”和“1330”搜索分别使用for循环在2.4和3.2秒内运行:

for lineNum, line in enumerate(lines):
    if search_item in line.lower():
        return lineNum, line
因此,在249个结果的情况下,列表理解的性能提高了10倍,而在6049个结果的情况下,列表理解的性能降低了3+x

显然,问题不在列表理解的if/in部分(两个搜索都扫描所有1M+行,并接受或拒绝每一行),而是在第二种情况下构建一个“长”的结果列表。换句话说,瓶颈似乎出现在

results = [lines.index(line), line]
理解部分

我想我很惊讶,对于大的结果集,列表理解变得如此缓慢(而6K真的没有那么大)。我错过了什么?我是否应该使用一种不同的方法来始终优于for循环?

list.index()调用必须搜索所有行以找到匹配项。对于N行,执行O(N^2)个步骤;1000行就变成了100万步,等等,对于6k行,这就是3600万步*

如果您只需要一个行号,请使用生成行号:

results = [[index, line] for index, line in enumerate(lines)
            if search_item in line.lower()]
enumerate()
在运行时添加一个正在运行的计数器,使算法只执行O(N)个步骤。您已经在完整的
for
循环语句中使用了它,但没有在列表中使用

但是,如果有重复的行,则输出会有所不同
lines.index()
查找第一个匹配项,而
enumerate()
生成唯一的行号


*给出了算法的渐近行为。由于给定行的
list.index()
只需扫描(最多)x行即可找到索引,如果对迭代的每一行都这样做,则只需取1+2+3+。。。总共x个步骤,这是一个。因此,总共只采取了(N*(N+1))/2)个步骤,粗略地说是1/2n^2个步骤。但是当N趋于无穷大时,乘数就不再重要了,最终得到O(N^2)。

调用必须搜索所有行以找到匹配项。对于N行,执行O(N^2)个步骤;1000行就变成了100万步,等等,对于6k行,这就是3600万步*

如果您只需要一个行号,请使用生成行号:

results = [[index, line] for index, line in enumerate(lines)
            if search_item in line.lower()]
enumerate()
在运行时添加一个正在运行的计数器,使算法只执行O(N)个步骤。您已经在完整的
for
循环语句中使用了它,但没有在列表中使用

但是,如果有重复的行,则输出会有所不同
lines.index()
查找第一个匹配项,而
enumerate()
生成唯一的行号



*给出了算法的渐近行为。由于给定行的
list.index()
只需扫描(最多)x行即可找到索引,如果对迭代的每一行都这样做,则只需取1+2+3+。。。总共x个步骤,这是一个。因此,总共只采取了(N*(N+1))/2)个步骤,粗略地说是1/2n^2个步骤。但是当N趋于无穷大时,乘法器就不再重要了,结果就是O(N^2)。

是的,但我们什么时候才能真正使用大O教授?@JeremyWest:一直以来。因为这很重要,我同意。那是个玩笑。马蒂恩,谢谢你!现在运行时间为0.3秒,结果为6K!非常感谢你的帮助@杰里迈韦斯特:很抱歉这么杀了它!是的,但我们什么时候才能真正使用big-O教授?@JeremyWest:一直如此。因为这很重要,我同意。那是个玩笑。马蒂恩,谢谢你!现在运行时间为0.3秒,结果为6K!非常感谢你的帮助@杰里迈韦斯特:很抱歉这么杀了它!您似乎已经了解了
enumerate()
。为什么不在列表理解中使用它?不理解list.index()的开销。另外,对Python还是非常陌生的,尤其是对列表理解。但是,现在我的应用程序中有一个超快速搜索。非常兴奋!您似乎已经了解了
enumerate()
。为什么不在列表理解中使用它?不理解list.index()的开销。另外,对Python还是非常陌生的,尤其是对列表理解。但是,现在我的应用程序中有一个超快速搜索。非常兴奋!