Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么计算这个的时差这么大?_Python - Fatal编程技术网

Python 为什么计算这个的时差这么大?

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 我运行了几次,第二种方法的速度始终是第一种方法的两倍左右。为什么差别如此之大 这实际上是一个关于您的特定计算机硬件的问题,可能涉及到硬件和

我需要将许多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

我运行了几次,第二种方法的速度始终是第一种方法的两倍左右。为什么差别如此之大

这实际上是一个关于您的特定计算机硬件的问题,可能涉及到硬件和细节,以及这些循环实际上是如何以本机方式执行的,因此我无法给出确切的答案。但我的猜测是,在这段特定的代码中,乘法、除法和模运算都需要大致相同的时间,并且时间大于加法或减法。在示例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