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

statistics.mean()vs sum()/len()vs np.average()用于列表列表

  •  2
  • rahs  · 技术社区  · 6 年前

    数据:大小相等的列表,必须沿列求平均值才能返回一个平均列表

    在python中使用以下两种方法之一平均上述数据是否更快 statistics.mean() sum()/len() 或者将其转换为numpy数组然后使用 np.average() ?

    还是没有显著差异?

    This question

    2 回复  |  直到 6 年前
        1
  •  4
  •   Dani Mesejo    6 年前

    您可以衡量不同方案的绩效。我假设沿着列的比意味着这是按行的。例如,如果你有1000个列表,每个列表的末尾有100个元素,那么你将得到一个平均值为100的列表。

    import random
    import numpy as np
    import statistics
    import timeit
    
    data = [[random.random() for _ in range(100)] for _ in range(1000)]
    
    
    def average(data):
        return np.average(data, axis=0)
    
    
    def sum_len(data):
        return [sum(l) / len(l) for l in zip(*data)]
    
    
    def mean(data):
        return [statistics.mean(l) for l in zip(*data)]
    
    
    if __name__ == "__main__":
        print(timeit.timeit('average(data)', 'from __main__ import data,average', number=10))
        print(timeit.timeit('sum_len(data)', 'from __main__ import data,sum_len', number=10))
        print(timeit.timeit('mean(data)', 'from __main__ import data,mean', number=10))
    

    输出

    0.025441123012569733
    0.029354612997849472
    1.0484535950090503
    

    看来 statistics.mean np.average sum_len 方法和比 np.平均值 总计 .

        2
  •  2
  •   mmagnuski    6 年前

    这可能取决于“行”和“列”中元素的数量(即列表的数量和每个列表中元素的数量),但是只要有10个列表,每个列表就有10个元素,就可以看到numpy的优势:

    import numpy as np
    from statistics import mean
    
    # construct the data
    n_rows = 10
    n_columns = 10
    data = [np.random.random(n_columns).tolist() for x in range(n_rows)]
    
    # define functions, I take your 'along columns' to mean that
    # columns dimention is reduced with mean:
    def list_mean(data):
        return [mean(x) for x in data]
    
    def numpy_mean(data):
        return np.asarray(data).mean(axis=1)
    
    # time results with %timeit magic in notebook:
    %timeit list_mean(data)
    # 528 µs ± 1.78 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit numpy_mean(data)
    # 19.7 µs ± 121 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)