Python 列表中的平均时间增量
我想计算列表中日期之间的平均时间差。 虽然下面的方法很有效,但我想知道是否有更聪明的方法Python 列表中的平均时间增量,python,list,average,timedelta,Python,List,Average,Timedelta,我想计算列表中日期之间的平均时间差。 虽然下面的方法很有效,但我想知道是否有更聪明的方法 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) 试试这个: from iterto
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)
试试这个:
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)
在我看来,这样做更具可读性。对于不太倾向于数学的代码读者的注释可能有助于解释如何计算每个增量。值得一提的是,一个生成器表达式拥有的操作码指令比我所看到的最少(我认为也是最慢的)
# The way in your question compiles to....
3 0 LOAD_CONST 1 (<code object <lambda> at 0xb7760ec0, file
"scratch.py", line 3>)
3 MAKE_FUNCTION 0
6 STORE_DEREF 1 (delta)
4 9 LOAD_GLOBAL 0 (sum)
12 LOAD_CLOSURE 0 (items)
15 LOAD_CLOSURE 1 (delta)
18 BUILD_TUPLE 2
21 LOAD_CONST 2 (<code object <genexpr> at 0xb77c0a40, file "scratch.py", line 4>)
24 MAKE_CLOSURE 0
27 LOAD_GLOBAL 1 (range)
30 LOAD_CONST 3 (1)
33 LOAD_GLOBAL 2 (len)
36 LOAD_DEREF 0 (items)
39 CALL_FUNCTION 1
42 CALL_FUNCTION 2
45 GET_ITER
46 CALL_FUNCTION 1
49 CALL_FUNCTION 1
52 STORE_FAST 1 (total)
5 55 LOAD_FAST 1 (total)
58 LOAD_GLOBAL 2 (len)
61 LOAD_DEREF 0 (items)
64 CALL_FUNCTION 1
67 LOAD_CONST 3 (1)
70 BINARY_SUBTRACT
71 BINARY_DIVIDE
72 STORE_FAST 2 (average)
75 LOAD_CONST 0 (None)
78 RETURN_VALUE
None
#
#doing it with just one generator expression and itertools...
4 0 LOAD_GLOBAL 0 (sum)
3 LOAD_CONST 1 (<code object <genexpr> at 0xb777eec0, file "scratch.py", line 4>)
6 MAKE_FUNCTION 0
5 9 LOAD_GLOBAL 1 (izip)
12 LOAD_FAST 0 (items)
15 LOAD_CONST 2 (1)
18 SLICE+1
19 LOAD_FAST 0 (items)
22 CALL_FUNCTION 2
25 GET_ITER
26 CALL_FUNCTION 1
29 CALL_FUNCTION 1
32 STORE_FAST 1 (total)
6 35 LOAD_FAST 1 (total)
38 LOAD_GLOBAL 2 (len)
41 LOAD_FAST 0 (items)
44 CALL_FUNCTION 1
47 LOAD_CONST 2 (1)
50 BINARY_SUBTRACT
51 BINARY_DIVIDE
52 RETURN_VALUE
None
#你问题中的方式编译成。。。。
3 0加载常数1(<0xb7760ec0处的代码对象lambda,文件
“scratch.py”,第3行>)
3生成函数0
6门店编号1(三角洲)
4 9加载_全局0(总和)
12加载0(项目)
15负载关闭1(三角形)
18构建元组2
21加载常数2(<0xb77c0a40处的代码对象genexpr,文件“scratch.py”,第4行>)
24闭合0
27负载_全局1(范围)
30荷载常数3(1)
33负载_全球2(len)
36加载顺序0(项目)
39调用函数1
42调用函数2
45吉特
46调用函数1
49调用函数1
52门店快速1(总计)
5 55负载快速1(总计)
58负载_全球2(len)
61加载顺序0(项目)
64调用函数1
67荷载常数3(1)
70二进制u减法
71二进制除法
72个存储单元快速2(平均)
75负载常数0(无)
78返回值
没有一个
#
#仅使用一个生成器表达式和itertools执行此操作。。。
4 0加载\u全局0(总和)
3加载常数1(<0xb777eec0处的代码对象genexpr,文件“scratch.py”,第4行>)
6生成函数0
5.9负载_全球1(izip)
12加载\u快速0(项目)
15荷载常数2(1)
18片+1
19加载快速0(项目)
22调用函数2
25天
26调用函数1
29调用函数1
32门店快速1(总计)
6 35负载快速1(总计)
38负载_全球2(len)
41加载快速0(项目)
44调用函数1
47荷载常数2(1)
50二进制减法
51二进制除法
52返回值
没有一个
特别是,删除lambda可以避免创建闭包、构建元组和加载两个闭包。有五个函数以任意方式被调用。当然,这种对性能的关注有点荒谬,但知道引擎盖下发生了什么是件好事。最重要的是可读性,我认为这样做的分数也很高。顺便说一句,如果你有一个时间增量或日期时间的列表,你为什么还要自己做数学呢
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)
在8640末尾再添加一个0将是一个良好的开端;)为什么不提高地球的自转速度呢。。。我想你是对的(是的,那好多了。谢谢@shinn,如果你接受THC4k的答案,那么我可以删除这个。你不应该删除它。我喜欢izip的方式。缩进不匹配!;)+因为OP和我都不知道这是可能的。datetime垃圾甚至比字符串更无聊;)我会用你的方法来计算平均值,然后用aaronasterling's来得到delta。Thank=)在索引上进行迭代不是很符合Python。我会选择:
[a-b代表a,b在zip中(datetimes[:-1],datetimes[1:])
在这个例子中,它应该是datetimes[I]-datetimes[I-1]
sum(timedelta_list ,datetime.timedelta())