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

时间:2018-09-22 15:00:47

标签: python

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

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

还是没有显着差异?

This question提供了使用哪种方法的答案,但未提及与替代方法的任何比较。

2 个答案:

答案 0 :(得分:3)

您可以衡量不同提案的效果。我假设比沿着列的意思是按行的。例如,如果最后有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.meannp.averagesum_len方法要慢得多(约慢35倍),比np.average要慢得多,比sum_len

答案 1 :(得分:2)

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

public List<string> GetCompanySymbolNames() {
    return m_CompanyCollection.Distinct<string>("symbol", new BsonDocument())?.ToList();
}

在这种情况下,numpy的平均速度比列表理解要快27倍,但是对于更大的数据,numpy的加速将更大(如果有100个列表,则每个numpy的100个元素的速度要快70倍左右。)