Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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循环方式快,这是否合理?_Python_List Comprehension - Fatal编程技术网

Python 在某些情况下,列表理解不一定比for循环方式快,这是否合理?

Python 在某些情况下,列表理解不一定比for循环方式快,这是否合理?,python,list-comprehension,Python,List Comprehension,蟒蛇说 列表理解提供了创建列表的简明方法 Python文档似乎没有说(可能这个声明不正确,如果需要请修复) “列表理解比for循环快” 这里有两个函数 def find_base_match_v1(char, matrix): base_matches = [] for row_index, row in enumerate(matrix): for column_index, column in enumerate(row): if ch

蟒蛇说

列表理解提供了创建列表的简明方法

Python文档似乎没有说(可能这个声明不正确,如果需要请修复)

“列表理解比for循环快”

这里有两个函数

def find_base_match_v1(char, matrix):
    base_matches = []
    for row_index, row in enumerate(matrix):
        for column_index, column in enumerate(row):
            if char == column:
                base_matches.append((row_index, column_index))
    return base_matches

def find_base_match_v2(char, matrix):
    base_matches = [(row_index, column_index)
                    for row_index, row in enumerate(matrix)
                    for column_index, column in enumerate(row)
                    if char == column]
    return base_matches
功能v1的性能(用于循环方法)

功能v2的性能(列表理解法)

有时结果是相反的,v2比v1快一点


无论如何,不能保证哪一个一定比另一个快,我的理解正确吗?

列表理解不是魔术。看看你的代码:它读取矩阵并存储 元素的坐标等于给定的字符:

matrix1 = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
print(timeit.timeit(lambda: find_base_match_v1('f', matrix1)))
# 1.002808532999552
print(timeit.timeit(lambda: find_base_match_v2('f', matrix1)))
# 1.0684777589995065
时间几乎是一样的,原因很明显:构建的列表很小

print(find_base_match_v1('f', matrix1))
# [(1, 2)]
print(find_base_match_v2('f', matrix1))
# [(1, 2)]
如果你构建了一个更大的列表,比如说有100个元素,那么列表理解就胜过了for循环(Ubuntu上的CPython 3.6):

但正如在一篇评论中所写的那样,医生并不能保证这一点。
有关更多信息,请参阅:

它只是简单明了,即键入和阅读的时间更短。没有任何关于性能的说法……你确定你衡量的是函数调用,而不仅仅是字符串创建吗?在我的机器上,即使是带有空网格的函数调用也需要
453ns
matrix1 = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
print(timeit.timeit(lambda: find_base_match_v1('f', matrix1)))
# 1.002808532999552
print(timeit.timeit(lambda: find_base_match_v2('f', matrix1)))
# 1.0684777589995065
print(find_base_match_v1('f', matrix1))
# [(1, 2)]
print(find_base_match_v2('f', matrix1))
# [(1, 2)]
matrix2 = [['f']*10 for _ in range(10)]
print(find_base_match_v1('f', matrix2))
# [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]

print(timeit.timeit(lambda: find_base_match_v1('f', matrix2)))
# 9.212440792000052
print(timeit.timeit(lambda: find_base_match_v2('f', matrix2)))
# 6.918398160998549