【问题标题】:time.time() not timingtime.time() 不是计时
【发布时间】:2013-01-11 06:49:37
【问题描述】:

我在 WingIDE 101(版本 4)的 Windows 7 操作系统上运行 Python 3.2。在这种情况下,环境并不重要,但我认为我应该具体一点。

我的代码如下。它并不是最优的,只是找到素数的一种方法:

def isPrime2(n):
  if n == 1:
      return False  
  count = 0
  for i in range(2,n+1,2):
    if n%i == 0:
      count = count + 1
      if count > 2:
        return False
  for i in range(1,n+1,2):
    if n%i == 0:
      count = count + 1
      if count > 2:
        return False         
  if count == 2:
    return True

start = time.time()
x = isPrime2(571)
end = time.time()
time_interval = end - start
print("%1.15f"%time_interval)
print(x)

我遇到的问题是 time.time() 函数似乎不是计时的。当我运行这个程序时,我得到了

0.000000000000000
True

我也尝试了最多 30 位数字,所有数字都保持为零。

考虑到我有多个 For 循环,我的程序不可能这么快。

我的问题是,为什么我的函数没有被计时?或者如果是,为什么在我知道不应该的情况下会这么快?

【问题讨论】:

    标签: python performance time semantics


    【解决方案1】:

    time.time() 实际上并不能保证分辨率优于 1 秒。您需要改用timeit 模块,它具有更高的分辨率。

    (编辑)

    Examples of alternative usages for `timeit`:
    
    n = 10000
    # Method 1: using default_timer()
    start = timeit.default_timer()
    for i in range (n):
        x = isPrime2(571)
    end = timeit.default_timer()
    time_interval = (end - start)/n
    print("%1.15f"%time_interval)
    
    # Method 2: using timeit()
    print("%1.15f"%(timeit.timeit('isPrime2(571)','from __main__ import isPrime2',number=n)/n))
    print(x)
    

    上面的代码替换了提问者代码中start = time.time() 行中的代码,两种替代方法产生了相似的时序。另见How to use timeit correctly

    【讨论】:

    • 当我使用 timeit.timeit() 代替 time.time() 时,timeit 起作用了。我很感激这么快的回复。我很好奇为什么我的时间是负面的。我不得不将 time_interval 改为 start-end。
    • @Steven:您不能使用timeit.timeit() 代替您的time.time()。您可以使用timeit.default_timer() as @Martijn Pieters showed or put the call to your function as a parameter of timeit.timeit(). I've edited my answer to show the appropriate usage. timeit.timeit()` 只返回调用默认timeit 设置函数一百万次所需的时间,因此第二次调用将返回一个大于第一次的数字大约一半时间随机调用。
    【解决方案2】:

    在 Windows 上,您想改用 time.clock()time.time() 的粒度只有 1/60 秒,而前者则提供微秒粒度。

    或者,为了保持跨平台,请改用timeit.default_timer(),这将为您的平台使用正确的time函数:

    import timeit
    
    start = timeit.default_timer()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2014-06-02
      • 2018-06-20
      • 2017-01-11
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多