python平均值代码_python中的运行平均值

我有两个可能的解决办法。这两个函数都是通用的运行平均值函数,适用于任何数字列表。(可以与任何无法识别的人一起工作)

基于发电机:

nums = [cauchy(3,1) for x in xrange(10)]

def running_avg(numbers):

for count in xrange(1, len(nums)+1):

yield sum(numbers[:count])/count

print list(running_avg(nums))

基于列表理解(实际上与前面的代码相同):

nums = [cauchy(3,1) for x in xrange(10)]

print [sum(nums[:count])/count for count in xrange(1, len(nums)+1)]

基于发电机的兼容发电机:

编辑

:这一个我刚刚测试了一下,看看我的解决方案是否可以轻松地与发电机兼容,以及它的性能如何。这就是我想到的。

def running_avg(numbers):

sum = 0

for count, number in enumerate(numbers):

sum += number

yield sum/(count+1)

看看下面的性能统计,很值得。

性能特点:

编辑

:我还决定测试ORIP对多个生成器的有趣使用,以了解对性能的影响。

使用timeit和以下(1000000次迭代3次):

print "Generator based:", ', '.join(str(x) for x in Timer('list(running_avg(nums))', 'from __main__ import nums, running_avg').repeat())

print "LC based:", ', '.join(str(x) for x in Timer('[sum(nums[:count])/count for count in xrange(1, len(nums)+1)]', 'from __main__ import nums').repeat())

print "Orip's:", ', '.join(str(x) for x in Timer('list(itertools.islice(running_avgs, 10))', 'from __main__ import itertools, running_avgs').repeat())

print "Generator-compatabile Generator based:", ', '.join(str(x) for x in Timer('list(running_avg(nums))', 'from __main__ import nums, running_avg').repeat())

我得到以下结果:

Generator based: 17.653908968, 17.8027219772, 18.0342400074

LC based: 14.3925321102, 14.4613749981, 14.4277560711

Orip's: 30.8035550117, 30.3142540455, 30.5146529675

Generator-compatabile Generator based: 3.55352187157, 3.54164409637, 3.59098005295

代码见注释:

Orip's genEx based: 4.31488609314, 4.29926609993, 4.30518198013

结果以秒为单位,并显示

液晶

新的生成器兼容的生成器方法要始终更快,您的结果可能会有所不同。我预计我的原始发电机和新发电机之间的巨大区别在于,总和不是即时计算的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值