我需要将许多UNIX时间戳舍入到它们各自的分钟数(再次表示为时间戳)。
出于好奇,我计时了两种方法:
%timeit (127/60)*60
10000000 loops, best of 3: 76.2 ns per loop
%timeit 127 - 127%60
10000000 loops, best of 3: 34.1 ns per loop
我多次运行过这两种方法,第二种方法的速度始终是第一种方法的两倍左右。为什么差距这么大?
我需要将许多UNIX时间戳舍入到它们各自的分钟数(再次表示为时间戳)。
出于好奇,我计时了两种方法:
%timeit (127/60)*60
10000000 loops, best of 3: 76.2 ns per loop
%timeit 127 - 127%60
10000000 loops, best of 3: 34.1 ns per loop
我多次运行过这两种方法,第二种方法的速度始终是第一种方法的两倍左右。为什么差距这么大?
>>> import dis
>>> method1 = lambda: (127 / 60) * 60
>>> method2 = lambda: 127 - 127 % 60
>>> dis.dis(method1)
1 0 LOAD_CONST 1 (127)
3 LOAD_CONST 2 (60)
6 BINARY_DIVIDE
7 LOAD_CONST 2 (60)
10 BINARY_MULTIPLY
11 RETURN_VALUE
>>> dis.dis(method2)
1 0 LOAD_CONST 1 (127)
3 LOAD_CONST 3 (7)
6 BINARY_SUBTRACT
7 RETURN_VALUE
根据以下timeit结果,除法是与其他操作(+
, -
, *
, %
) 相比较重的操作:
In [9]: timeit 127 + 12
100000000 loops, best of 3: 14.8 ns per loop
In [10]: timeit 127 - 12
100000000 loops, best of 3: 14.8 ns per loop
In [11]: timeit 127 * 12
100000000 loops, best of 3: 14.9 ns per loop
In [12]: timeit 127 / 12
10000000 loops, best of 3: 40 ns per loop
In [13]: timeit 127 % 12
100000000 loops, best of 3: 14.7 ns per loop
更新
我错了。正如Tim Peters所评论的那样,使用变量会显示不同的结果。
In [1]: a, b = 127, 12
In [2]: timeit a + b
10000000 loops, best of 3: 37.6 ns per loop
In [3]: timeit a - b
10000000 loops, best of 3: 37.9 ns per loop
In [4]: timeit a * b
10000000 loops, best of 3: 52.7 ns per loop
In [5]: timeit a / b
10000000 loops, best of 3: 54 ns per loop
In [6]: timeit a % b
10000000 loops, best of 3: 56.5 ns per loop
%timeit a - a%p
和%timeit (a/p)*p
。所以Tim是对的,你也是对的。 :-) - LetMeSOThat4Uint
和 long
在 Py3 中变成相同类型(Py2 称为 long
,Py3 称为 int
)的结果。而这个结果的一个后果是,Py3 的 eval 循环不再特别处理(曾经是)int
。有得有失;-) - Tim Peters