Python时间性能测量 time.clock() time.time() timeit.timeit()

本文介绍了Python中三种常用的性能测试方法:CPU时间、时钟时间和使用timeit模块进行基准测试。通过具体示例对比了不同方法在测量函数执行效率上的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢:http://www.cnblogs.com/herbert/p/3395268.html   http://blog.youkuaiyun.com/my2010sam/article/details/9831821

主要有以下三种方式:

一,CPU时间

time.clock()

测量CPU时间,比较精准,通过比较程序运行前后的CPU时间差,得出程序运行的CPU时间。

二, 时钟时间

time.time()

测量时钟时间,也就是通常的类似掐表计时。

三,基准时间

timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)

简短示例:

timeit(“math.sqrt(2.0)”, “import math”)

timeit(“sqrt(2.0)”, “from ,math import sqrt”)

timeit(“test()”, “from __main__ import test”, number = 10000)

测试一行代码的运行时间,在Python中比较方便,可以直接使用timeit:

Timer 类:

__init__(stmt="pass", setup="pass", timer=default_timer)
     stmt 是执行语句,setup 是导入执行语句环境
print_exc(file=None)
timeit(number=default_number)
     返回测试所用秒数,number 是每个测试中调用被计时语句的次数
repeat(repeat=default_repeat, number=default_number)
     返回测试所用秒数列表,repeat 是重复整个测试的次数,number 是每个测试中执行语句的次数
快捷方法:
timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number)
    = Timer(stmt, setup, timer).timeit(number)
repeat(stmt="pass", setup="pass", timer=default_timer, repeat=default_repeat, number=default_number)
    = Timer(stmt, setup, timer).repeat(repeat, number)
default_timer 在 win32 下是 time.clock(),在 linux 下是 time.time()
default_number = 1000000
default_repeat = 3


实例:

import timeit

def func1(x):
    pow(x, 2)

def func2(x):
    return x * x

v = 10000

func1_test = 'func1(' + str(v) + ')'
func2_test = 'func2(' + str(v) + ')'

print timeit.timeit(func1_test, 'from __main__ import func1')
print timeit.timeit(func2_test, 'from __main__ import func2')

print timeit.repeat(func1_test, 'from __main__ import func1')
print timeit.repeat(func2_test, 'from __main__ import func2')

 

三种方法比较示例(示例中的三个方法都是求解一个数的因子数的个数)

CPU时间的示例:

import time

def countDiv(n):
    "Return the count number of divisors of n."
    count = 1
    for i in range(1, n):
        if n%i == 0:
            count += 1
    return count

def countDiv2(n):
    return len([x for x in range(1, n+1) if n%x == 0])

def countDiv3(n):
    s = set()
    for i in range(1, n):
        if i in s:
            break
        else:
            if n%i == 0:
                s.update({i, n/i})
    return len(s)

start_CPU = time.clock()
a = countDiv(73920)
end_CPU = time.clock()
print("Method 1: %f CPU seconds" % (end_CPU - start_CPU))

start_CPU = time.clock()
a = countDiv2(73920)
end_CPU = time.clock()
print("Method 2: %f CPU seconds" % (end_CPU - start_CPU))

start_CPU = time.clock()
a = countDiv3(73920)
end_CPU = time.clock()
print("Method 3: %f CPU seconds" % (end_CPU - start_CPU))


 

结果:最快的是方法三,方法二和方法一,其实不相上下.

Method 1: 0.022805 CPU seconds
Method 2: 0.015988 CPU seconds
Method 3: 0.000141 CPU seconds


 

时钟时间示例:

import time

start_Real = time.time()
a = countDiv(73920)
end_End = time.time()
print("Method 1: %f real seconds" % (end_End - start_Real))

start_Real = time.time()
a = countDiv2(73920)
end_End = time.time()
print("Method 2: %f real seconds" % (end_End - start_Real))

start_Real = time.time()
a = countDiv3(73920)
end_End = time.time()
print("Method 3: %f real seconds" % (end_End - start_Real))


 

结果:

Method 1: 0.016001 real seconds
Method 2: 0.016001 real seconds
Method 3: 0.000000 real seconds


 

在精度不够的情况下,都无法得知,方法三真正的运行时间.

 

真的想知道,方法三比方法一或者二快多少倍,还是要使用timeit。timeit可以重复执行代码一定次数,这样更加稳定的反应程序的执行时间,不会因为一次的执行而产生较大的误差。

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("countDiv(73920)", setup = "from __main__ import countDiv", number=100))
    print(timeit.timeit("countDiv2(73920)", setup = "from __main__ import countDiv2", number=100))
    print(timeit.timeit("countDiv3(73920)", setup = "from __main__ import countDiv3", number=100))


 

结果:

1.6992941682537246
1.69091280670973
0.013773491283526784


 

通过timeit可以看出,方法二基本和方法一的性能是相同的。timeit返回是时钟时间。方法二,基本是方法三耗时的130倍左右。

<think>好的,我现在需要帮用户解决AttributeError: module 'time' has no attribute 'clock'这个问题。首先,我得回忆一下用户提到的错误信息,这个错误通常是因为在Python 3.8及以上版本中,time模块的clock()函数被移除了。用户可能在他们的代码中调用了time.clock(),而现在的Python版本已经不支持这个函数了。 接下来,我应该考虑用户为什么会遇到这个问题。可能的情况是他们正在运行一个旧版本的代码,或者参考了过时的教程或文档。特别是如果他们从Python 2.x迁移到3.x,这样的问题很常见,因为Python 3.8之后移除了很多废弃的特性。我需要确定用户当前的Python版本,但用户可能不知道如何检查,所以可能需要建议他们运行python --version或者查看错误信息中的提示。 然后,我需要解释错误的原因。time.clock()Python 3.3中被标记为过时,并在3.8中彻底移除。替代方案是使用time.perf_counter()time.process_time(),具体取决于他们的需求。用户可能不太清楚这些替代函数之间的区别,所以需要简单说明一下:perf_counter()用于测量时间的代码执行,而process_time()关注CPU时间。 接下来,我需要提供具体的解决方案。首先,建议用户将time.clock()替换为time.perf_counter(),这是最常见的替换方式。同时,考虑到用户可能希望他们的代码在旧版本和新版本Python中都能运行,可以建议使用try-except块来兼容不同版本。例如,先尝试导入perf_counter,如果失败则回退到clock,但需要提醒在3.8之后这仍然会失败,所以更好的做法是直接替换并升级代码。 另外,用户可能在使用某些第三方库时遇到这个问题,这时候需要建议他们检查库的版本,并升级到支持新Python版本的版本。如果库已经过时,可能需要寻找替代方案或者联系维护者。 还要注意用户可能是在不同的操作系统中遇到这个问题,比如Windows和Linux下的时间函数表现可能不同,但在这个特定错误中,主要问题还是函数被移除,与操作系统无关。 最后,总结预防策略,比如检查Python版本,更新旧代码,使用IDE的提示功能等。可能还需要提醒用户在编写代码时参考最新的官方文档,避免使用废弃的函数。 需要确保回答结构清晰,分点列出错误原因、解决方案、替代函数对比和预防措施,方便用户一步步理解和解决问题。同时,语言要简洁明了,避免使用过多技术术语,让不同层次的用户都能理解。</think>$\boxed{AttributeError:\ module\ 'time'\ has\ no\ attribute\ 'clock'}$ 错误解析及解决方案: ━━━━━━━━━━━━━━ ### **错误本质** 此错误表明你正在Python 3.8+版本中调用`time.clock()`,但该函数**自Python 3.8起已被正式移除**。这是Python 2.x到3.x迁移过程中常见的兼容性问题。 --- ### **核心原因** 1. **版本迭代** - Python 2.x中`time.clock()`用于测量处理器时间 - Python 3.3标记该函数为废弃(Deprecated) - Python 3.8彻底删除此函数 2. **代码迁移问题** - 运行基于Python 2.x编写的旧代码 - 参考了过时的教程/文档 --- ### **解决方案** #### 方法1:直接替换函数(推荐) ```python import time # 原代码:start = time.clock() start = time.perf_counter() # 替代方案1:高精度计时器 # 或 start = time.process_time() # 替代方案2:进程CPU时间 ``` #### 方法2:版本兼容写法 ```python import time # 根据Python版本自动选择 if hasattr(time, 'perf_counter'): timer = time.perf_counter else: timer = time.clock # 仅适用于3.8以下版本 start = timer() ``` --- ### **替代函数对比** | 函数 | 适用场景 | 精度 | 跨平台一致性 | |---------------------|-------------------------|----------------|------------| | `time.perf_counter` | 测量代码执行时间(含sleep) | 纳秒级 | 高 | | `time.process_time` | 测量CPU工作时间(不含sleep)| 微秒级 | 中 | | `time.time` | 获取当前时间戳 | 秒级 | 低 | --- ### **深度扩展** **1. 第三方库依赖问题** 若错误出现在导入的库中(如`numpy`旧版本),需升级依赖库: ```bash pip install --upgrade numpy # 示例 ``` **2. 性能试最佳实践** ```python from timeit import default_timer as timer # 官方推荐方式 start = timer() # 被代码 end = timer() print(f"耗时:{end - start:.6f}秒") ``` **3. 历史背景** `time.clock()`在Windows和Unix系统中的行为不同: - Windows返回处理器时间 - Unix返回墙上时钟时间 这种不一致性是导致其被废弃的主要原因。 --- ### **预防策略** 1. 检查Python版本: ```bash python --version # 确认是否≥3.8 ``` 2. 代码升级工具: 使用`2to3`工具自动转换Python 2代码: ```bash 2to3 -w your_script.py ``` 3. IDE配置: 在VS Code/PyCharm中启用**DeprecationWarning提示** 通过理解时间测量函数的演进逻辑,可从根本上避免此类兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值