数据:必须沿列平均的相等大小列表的列表,以返回一个平均列表
使用statistics.mean()
或sum()/len()
之一在python中平均上述数据是否更快,或者将其转换为numpy数组然后使用np.average()
是否更快?
还是没有显着差异?
This question提供了使用哪种方法的答案,但未提及与替代方法的任何比较。
答案 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.mean
比np.average
和sum_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倍左右。)