python计时器timeit返回秒数_python计时函数timeit.timeit()使用小结

本文介绍如何使用Python的timeit模块评估代码执行效率,并通过实例演示了如何对比不同数据结构在访问记录统计任务中的性能表现。

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

Python提供了一个timeit.timeit()函数用于计算函数的运行时间,这使得我们在项目开发中很方便的设计profiling并根据结果做相应的优化, 其定义如下:

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

Create a Timer instance with the given statement, setup codeand timer function andrun its timeit() method with number executions.

Newin version 2.6.

例如,假设我们在某个项目中要统计并存储访问过的url,一个可能的实现如下所示:

1 classUrlStatistics:2 def __init__(self):3 self.visitedSites =dict()4

5 defvisit(self, url):6 if url inself.visitedSites:7 self.visitedSites[url] += 1

8 else:9 self.visitedSites[url] = 1

10

11 def mostFrequentVisitedSites(self, n=10):12 sortedSites =sorted(self.visitedSites.items(),13 key=lambda pair: pair[1], reverse=True)14 return [(url, visits) for url, visits in sortedSites[:n]]

上面示例代码中用一个dict变量存储所有访问过的url(line 2), 函数visit() 将每一个新访问的的url计入我们的统计当中(line5~9), 函数mostFrequentVisitedSites()返回访问最频繁的前十名url(line 11~14). 为了使用timeit.timeit()函数计算visit()或mostFrequentVisitedSites()执行效率,我们需要让该函数反复执行,因此我们还需要以某种方式来反复得到不同或相同的URL。 下面的get_url_name()函数随机从英文字母表选取3-7个字符并拼接成URL, test_visit()函数用于调用UrlStatistics.visit(), 最后我们用timeit.timeit()调用test_visit()函数并设定调用次数,最后得到运行时间:

1 defget_url_name():2 prefix = 'www'

3 suffix = 'com'

4 name = ''.join([random.choice(string.ascii_lowercase)5 for i in range(random.randint(3, 7))])6 return '.'.join([prefix, name, suffix])7

8

9 deftest_visit():10 urlStats =UrlStatistics()11 urlStats.visit(get_url_name())12

13

14 if __name__ == '__main__':15 print(timeit.timeit('test_visit()',16 setup='from __main__ import test_visit',17 number=600000))

结果如下:

stephenw@stephenw-devbox1:~/pyTest$ ./timeitTest.py8.078887998002756

考虑到python中collections模块中的defaultdict可以让visit()函数看上去更简洁,我们可做如下修改:

classUrlStatistics:def __init__(self):

self.visitedSites=defaultdict(int)defvisit(self, url):

self.visitedSites[url]+= 1

相应的,由timeit.timeit()得到的运行时间为 8.326297112002067, 可见使用defaultdict()后,效率降低了

最后,timeit模块还提供了命令行接口来实现同样的功能(结果和上面略有差异):

stephenw@stephenw-devbox1:~/pyTest$ python -m timeit -n 600000 "from timeitTest import test_visit; test_visit()"

600000 loops, best of 3: 9.83 usec per loop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值