为了账号安全,请及时绑定邮箱和手机立即绑定

计算列表平均值的最快方法

计算列表平均值的最快方法

临摹微笑 2022-06-02 10:10:09
我想找到计算 python 平均值的最快方法list。我有数百万个lists 存储在 a 中dictionary,因此我正在寻找性能方面最有效的方法。参考这个问题,如果l是浮点数列表,我有numpy.mean(l)sum(l) / float(len(l))reduce(lambda x, y: x + y, l) / len(l)哪种方式最快?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

正如@DeepSpace 所建议的那样,您应该尝试自己回答这个问题。您还可以考虑在使用之前将列表转换为数组numpy.mean。使用%timeit如下ipython:


In [1]: import random

In [2]: import numpy

In [3]: from functools import reduce

In [4]: l = random.sample(range(0, 100), 50) # generates a random list of 50 elements

numpy.mean无需转换为 np.array

In [5]: %timeit numpy.mean(l)

32.5 µs ± 2.82 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

numpy.mean转换为 np.array

In [5]: a = numpy.array(a)

In [6]: %timeit numpy.mean(a)

17.6 µs ± 205 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

sum(l) / float(len(l))

In [5]: %timeit sum(l) / float(len(l)) # not required casting (float) in Python 3

774 ns ± 20.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

sum(l) / len(l)

In [5]: %timeit sum(l) / len(l)

623 ns ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

reduce

In [6]: reduce(lambda x, y: x + y, l) / len(l)

5.92 µs ± 514 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

从最慢到最快:

  1. numpy.mean(l)无需转换为数组

  2. numpy.mean(a)将列表转换为np.array

  3. reduce(lambda x, y: x + y, l) / len(l)

  4. sum(l) / float(len(l)), 这适用于 Python 2 和 3

  5. sum(l) / len(l)# 对于 Python 3,你不需要强制转换(使用float


查看完整回答
反对 回复 2022-06-02
?
RISEBY

TA贡献1856条经验 获得超5个赞

下午好,我刚刚对列表中的 10 个随机浮点数进行了测试,并进行了时间测试,发现 numpy 是最快的。


#!/usr/bin/python


import numpy as np

from functools import reduce

import time


l = [0.1, 2.3, 23.345, 0.9012, .002815, 8.2, 13.9, 0.4, 3.02, 10.1]


def test1():

    return np.mean(l)


def test2():

    return sum(l) / float(len(l))


def test3():

    return reduce(lambda x, y: x + y, l) / len(l)


def timed():

    start = time.time()

    test1()

    print('{} seconds'.format(time.time() - start))

    start = time.time()

    test2()

    print('{} seconds'.format(time.time() - start))

    start = time.time()

    test3()

    print('{} seconds'.format(time.time() - start))


timed()

与往常一样,我确信有更好的方法可以做到这一点,但这可以解决问题。这是一个小列表:看看你在大列表中找到了什么会很有趣。


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号