代码之家  ›  专栏  ›  技术社区  ›  S. Jacson

任意两台发电机的速度差(内置功能)

  •  2
  • S. Jacson  · 技术社区  · 2 年前

    两者的作用几乎相同 并且得到了同样的结果。

    
    from timeit import timeit
    
    lst = [0] * 10000000
    
    txt1 = "any(i % 2 for i in lst)"
    txt2 = "any(True for i in lst if i % 2)"
    
    print(timeit(txt1, globals=globals(), number=2))
    print(timeit(txt2, globals=globals(), number=2))
    
    

    结果:

    Time : 2.112963530991692
    Time : 0.9412867689970881
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   sj95126    2 年前

    原因在于每台发电机的产量。第一台发电机生产10000000台 False i % 2 永远不会是非零。

    通过从计时中删除生成器和列表创建,可以看到类似的差异:

    >>> x = []
    >>> y = [0] * 10000000
    >>> timeit("any(x)", globals=globals(), number=2)
    3.900029696524143e-06
    >>> timeit("any(y)", globals=globals(), number=2)
    0.12017650000052527
    
        2
  •  1
  •   Copperfield    2 年前

    正如@sj95126在评论中所说:第一个生成器生成10000000个值供any()检查,第二个生成器生成0个值

    当然,你可以在更小的样本中通过调用列表来检查它,而不是调用任何列表

    >>> lst = [0]*10
    >>> any(i % 2 for i in lst)
    False
    >>> list(i % 2 for i in lst)
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    >>> any(True for i in lst if i % 2)
    False
    >>> list(True for i in lst if i % 2)
    []
    >>>