2

我在 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 循环,我的程序不可能这么快。

我的问题是,为什么我的功能没有计时?或者如果是,为什么我知道它不应该这么快?

4

2 回答 2

6

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

或者,为了让它保持跨平台,请timeit.default_timer()改用,它将time为您的平台使用正确的功能:

import timeit

start = timeit.default_timer()
于 2013-01-27T23:29:30.830 回答
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()提问者代码中的代码,两种替代方法产生了相似的时序。另请参阅如何正确使用 timeit

于 2013-01-27T23:24:00.237 回答