淘先锋技术网

首页 1 2 3 4 5 6 7

参考链接: Python中的Timeit与示例

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

  

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

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

 

    New in version 2.6. 

  

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

  

   1 class UrlStatistics:

 2     def __init__(self):

 3         self.visitedSites = dict()

 4 

 5     def visit(self, url):

 6         if url in self.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 def get_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 def test_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.py

8.078887998002756 

  

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

  

  class UrlStatistics:

    def __init__(self):

        self.visitedSites = defaultdict(int)

 

    def visit(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

 

  

    

  

 

转载于:https://www.cnblogs.com/wangwenzhi2019/p/10892594.html