代码之家  ›  专栏  ›  技术社区  ›  Konstantin

python 3中循环、列表理解和映射的性能

  •  3
  • Konstantin  · 技术社区  · 7 年前

    如何在Python3.6中正确比较for循环、列表理解和映射的性能?

    在下面的代码中,普通的for循环执行得非常好(我使用 list() 从生成器获取值)。我在这里做错什么了吗?结果与 discussion on Python 2 是的。

    import timeit
    
    code_for = """
    for i in range(1000):
        hex(i)
    """
    
    code_map = """
    list(map(hex, range(1000)))
    """
    
    code_map_lambda = """
    list(map(lambda x: hex(x), range(1000)))
    """
    
    code_list_comprehension = """
    [hex(x) for x in range(1000)]
    """
    
    print(timeit.timeit(code_for, number=10000))
    # 1.1155821208376437
    
    print(timeit.timeit(code_map, number=10000))
    # 0.8820606248918921
    
    print(timeit.timeit(code_map_lambda, number=10000))
    # 1.7510833400301635
    
    print(timeit.timeit(code_list_comprehension, number=10000))
    # 1.1798800542019308
    

    更新:在列表中添加元素 code_for

    code_for_2 = """
    a = [0] * 1000
    for i in range(1000):
        a[i] = hex(i)
    """
    # 1.243549756007269
    
    code_for_3 = """
    a = []
    for i in range(1000):
        a.append(hex(i))
    """
    # 1.5462996119167656    
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   jpp    7 年前

    几点建议:

    1. 为了清晰起见,请将代码包装在函数中。
    2. 您缺少列表创建和附加 code_for 是的。这是使用显式 for 循环。
    3. 你可以用 timeit ,或者如果你有Jupyter笔记本, %timeit 命令。

    如下所示, map 没有 lambda 表现最好,这是有道理的 hex 是内置的。见 Python List Comprehension Vs. Map 更多细节。

    def code_for(n):
        res = []
        for i in range(n):
            res.append(hex(i))
        return res
    
    def code_map(n):
        return list(map(hex, range(n)))
    
    def code_map_lambda(n):
        return list(map(lambda x: hex(x), range(n)))
    
    def code_list_comprehension(n):
        return [hex(x) for x in range(n)]
    
    %timeit code_for(10000)                 # 3.19 ms per loop
    %timeit code_map(10000)                 # 1.69 ms per loop
    %timeit code_map_lambda(10000)          # 3.06 ms per loop
    %timeit code_list_comprehension(10000)  # 2.27 ms per loop