delta = lambda last, next: (next - last).seconds + (next - last).days * 86400
total = sum(delta(items[i-1], items[i]) for i in range(1, len(items)))
average = total / (len(items) - 1)
datetimes = [ ... ]
# subtracting datetimes gives timedeltas
timedeltas = [datetimes[i-1]-datetimes[i] for i in range(1, len(datetimes))]
# giving datetime.timedelta(0) as the start value makes sum work on tds
average_timedelta = sum(timedeltas, datetime.timedelta(0)) / len(timedeltas)
from itertools import izip
def average(items):
total = sum((next - last).seconds + (next - last).days * 86400
for next, last in izip(items[1:], items))
return total / (len(items) - 1)
顺便说一句,如果你有一个时间增量或日期时间的列表,你为什么还要自己做数学计算呢?
试试这个:
在我看来,这样做更有可读性。对不太喜欢数学的代码读者的评论可能有助于解释如何计算每个增量。值得一提的是,一个生成器表达式的操作码指令最少(我认为最慢)。
特别是,除去lambda允许我们避免创建闭包、构建元组和加载两个闭包。无论哪种方式都会调用五个函数。当然,这种对表演的关注有点荒谬,但很高兴知道幕后发生了什么。最重要的是可读性,我认为这样做的得分也很高。
相关问题 更多 >
编程相关推荐