Python 为什么计算这个的时差这么大?
我需要将许多UNIX时间戳舍入到它们各自的分钟数(再次表示为时间戳) 出于好奇,我选择了两种方法:Python 为什么计算这个的时差这么大?,python,Python,我需要将许多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 我运行了几次,第二种方法的速度始终是第一种方法的两倍左右。为什么差别如此之大 这实际上是一个关于您的特定计算机硬件的问题,可能涉及到硬件和
%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
我运行了几次,第二种方法的速度始终是第一种方法的两倍左右。为什么差别如此之大 这实际上是一个关于您的特定计算机硬件的问题,可能涉及到硬件和细节,以及这些循环实际上是如何以本机方式执行的,因此我无法给出确切的答案。但我的猜测是,在这段特定的代码中,乘法、除法和模运算都需要大致相同的时间,并且时间大于加法或减法。在示例1中有两个较慢的操作,但在示例2中只有一个
编辑:正如falsetru在他的回答中所显示的,这可能是一个除法与其他操作的问题。但同样,如果没有更多的细节,就不可能明确地说 根据以下时间结果,除法是相对于其他操作(
+
,-
,*
,%
)的繁重操作:
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所评论的,使用varaible可以显示不同的结果
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
在第二种情况下,模运算被简单地优化掉。除法比乘法、减法和模运算要昂贵得多。哪种版本的Python?我想知道这里是整数除法还是浮点除法。@TimPeters如果两个参数都是整数,那么/就是整数除法。@TimPeters:2.7x64,Linux@DanKruchinin,不正确:在Python3中,
/
是浮点除法,即使两个操作数都是整数<代码>/在Python 3中是整数除法。哈哈,很好:)我认为智能编译器会优化整个表达式,无论它是如何编写的…@vasily:slap,forehead在现实生活中,我认为值127将作为变量而不是常量传入,在这种情况下,m2中的优化将消失。最好使用变量,因为编译器可能会优化文本上的其他操作。@TimPeters,谢谢您的评论。我更新了答案以包含变量版本。@falsetru:不过还是有区别,让a=127,p=60并运行%timeit a-a%p
vs%timeit(a/p)*p
。所以提姆是对的,而你是对的。:-)@约翰多,我更新了答案,加入了可变版本。很抱歉。听起来不错-这是由于Py3中的int
和long
成为同一类型(Py2称之为long
,Py3称之为int
)的结果。这样做的一个结果是Py3 eval循环不再是特殊情况下的snot out(过去是)int
s。赢一些,输一些;-)
>>> 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