2017-10-20 15 views
2

我对time.time()函数的某些行为有点困惑,并且对我是否只是无知而感到好奇。连续,同线函数调用与解包

好了,所以我知道我可以解压和分配两个函数调用是这样的:

>>> import time 
>>> beg, end = time.time(), time.time() 
>>> beg == end 
True 

这种平等是有道理的,因为在执行的时候,第一time.time()和第二time.time()是相同的 - 他们在同一时间点进行评估。

更重要的是混乱的是:

>>> beg = time.time(); end = time.time() 
>>> beg == end 
True 

这种平等,我觉得很奇怪。我猜time.time()只能舍入到7位小数,也许Python的速度足以在小于0.0000001秒内执行这两个命令(我的直觉告诉我这是这种情况)。我认为这是平等的,也许只是Python的是一个时间真快,所以我尝试了很多次:

for _ in range(10000): 
    beg = time.time(); end = time.time() 
    assert beg == end 

对于我来说,这引起了不AssertionError。这是什么交易? Python比我信任它更快吗?我的假设是,;-分隔陈述连续评估,但不是同时(因此我惊讶beg从来没有不等于end)。

编辑:

这里是time.time()回报我,用我的机器的规格一起:

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> import time 
>>> time.time() 
1508532204.5873115 
>>> time.time() 
1508532250.9893117 
+0

这对我来说每一次的假。你真的从'time.time()'中得到了什么?你的系统时间是多少?它实际上是在滴答滴答吗? – user2357112

+0

此外,“在执行的时候,第一个选定了time.time()和第二了time.time()是相同的 - 他们在同一时间点评估” - 这不是它是如何工作的。 – user2357112

+0

@ user2357112如何“它的工作”呢?在元组解包的例子中,它们是否也被连续评估? – blacksite

回答

2

首先,关于展开列表中的假设是错误的。 beg, end = time.time(), time.time()可以提供不同的时间值,因为time()函数计算两次,并且可以返回单独的结果。

具体而言,Python首先构建一个包含两个时间值的元组(time.time(), time.time())。然后将该元组解包到变量beg, end中。

并没有什么特别的魔法可以使用paralellisation或值缓存,甚至var-by-var赋值(考虑:a,b = b,a值交换模式:它的字面意思是t = (b,a); (a,b) = t)。


其次,时间戳比较高度依赖于您的系统(主要是操作系统)。

对于time.time(),细粒度的分辨率只是不能保证:

注意,即使时间总是返回浮点 数量,而不是所有的系统提供时间比1更好的精度第二个是 。

在unix系统上(不是MacOSX),您可以尝试使用time.clock_getres(clk_id)来获得时钟分辨率。

在Windows上,因为它似乎是你的话,你也许可以找到从Win32中的信息调用到手册time.clock()中提到QueryPerformanceCounter()(我没有足够的知识上的Windows API的评论)。

你也应该对谷歌的时间精度您的操作系统来回答这个问题,因为它是没有太大的蟒蛇相关。

如果分辨率是不够的,这样的测量,并且CPU速度非常快(通常用于现今),则时间测量将是太近区分它们。当然,如果在CPU中进行测量,它们将会不同并且相距甚远。但最小可用时间单位没有区别。

要注意的是,尝试在慢得多的机器上执行您的代码,或者CPU在某些计算任务(即99-100%CPU使用率)下高负载时,并且不能在您的进程上花费太多时间。如果CPU不仅仅忙于一个进程,而且更经常地在多个进程之间切换上下文 - 例如,通过拥有数百个CPU密集型进程或者1-2千个只是空闲的CPU(如在叉式炸弹中)。


UPD:要在问题的补充细节:的逗号后的位数只字未提你的机器上的时间分辨率,但它不是1秒。

操作系统只是测量1秒的帧之内的东西。结果不仅取决于时钟分辨率,而且取决于时间请求,并且可能会有所不同。

且不说与浮动精度,其中所述级分可以被不适当地四舍五入到最接近的“嵌合”浮动的问题。这取决于有多大逗号之前的部分比较彩车精度:

>>> 2/3 
0.6666666666666666 

>>> 2000000/3 
666666.6666666666 

>>> 200000000000/3 
66666666666.666664 # <== Surprise! ;-)