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

rah*_*ahs 2 python

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

statistics.mean()使用或之一对 python 中的上述数据进行平均是否更快,sum()/len()或者将其转换为 numpy 数组然后使用是否更快np.average()

或者没有显着差异?

这个问题提供了使用哪种方法的答案,但没有提及与替代方案的任何比较。

Dan*_*ejo 5

您可以衡量不同提案的绩效。我假设沿着列意味着这是行方向的。例如,如果您有 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))
Run Code Online (Sandbox Code Playgroud)

输出

0.025441123012569733
0.029354612997849472
1.0484535950090503
Run Code Online (Sandbox Code Playgroud)

看起来 比statistics.mean慢很多(大约慢 35 倍),并且np.average方法sum_len和 比np.average稍微快一些sum_len