系统学习Python——装饰器:函数装饰器-[对调用计时:基础代码]

news/2025/2/23 9:40:15

目录:《系统学习Python》总目录


为了展示函数装饰器的多样化能力,让我们来看一种不同的用例。接下来的装饰器将对被装饰数的调用进行计时一一既有单次调用的用时,也有全部调用的总时间。该装饰器应用于两个函数,以便比较列表推导和内置调用的相对速度:

import time, sys

class timer:
    def __init__(self, func):
        self.func = func
        self.all_time = 0
        
    def __call__(self, *args, **kargs):
        start = time.perf_counter()
        result = self.func(*args, **kargs)
        elapsed = time.perf_counter() - start
        self.all_time += elapsed
        print('%s: %f, %f' % (self.func.__name__, elapsed, self.all_time))
        return result
    
@timer
def listcomp(N):
    return [x * 2 for x in range(N)]

force = list if sys.version_info[0] == 3 else (lambda X:X)
@timer
def mapcall(N):
    return force(map((lambda x:x * 2), range(N)))

输入:

listcomp(1000000)
listcomp(1000000)
mapcall(1000000)
mapcall(1000000)

日志输出:

listcomp: 0.108877, 0.108877
listcomp: 0.084942, 0.193819
mapcall: 0.137001, 0.137001
mapcall: 0.143745, 0.280745

输出:

[2, 4, 6, 8, ...]
[2, 4, 6, 8, ...]
[2, 4, 6, 8, ...]
[2, 4, 6, 8, ...]

当然了,计时时间随Python系列和测试机器而变化。这里的累计时间作为一个可用的实例属性出现。通常,当列表推导中没有函数调用时,map调用几乎比它慢两倍(也可以说,map函数调用的需求使其变慢)。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.


http://www.niftyadmin.cn/n/5354686.html

相关文章

Python XPath解析html出现⋆解决方法 html出现#123;解决方法

前言 爬网页又遇到一个坑,老是出现乱码,查看html出现的是&#数字;这样的。 网上相关的“Python字符中出现&#的解决办法”又没有很好的解决,自己继续冲浪,费了一番功夫解决了。 这算是又加深了一下我对这些iso、Unicode编…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富; …

MySQL索引原理以及SQL优化

案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…

10 Controller和RestController

Controller: 用途&#xff1a; Controller 用于定义一个传统的Spring MVC控制器。它通常用于构建传统的Web应用&#xff0c;其中页面渲染和视图呈现是重要的。 返回类型&#xff1a; 方法通常返回一个视图名称&#xff0c;该视图名称用于告诉Spring MVC渲染哪个视图。 默认情…

fetch和axios的区别

概念不同 Fetch是一种新的获取资源的接口方式&#xff0c;可以直接使用Axios是一个基于XMLHttpRequest封装的工具包&#xff0c;需要引入才可以使用 传递数据的方式不同 Fetch则是需要放在body属性中&#xff0c;以字符串的方式进行传递Axios是放到data属性里&#xff0c;以对象…

安卓主板_紫光展锐T820安卓主板方案定制

安卓主板采用了性能强劲的紫光展锐T820八核处理器&#xff0c;搭载了Android 13系统&#xff0c;为用户带来更加顺畅的操作体验。该主板不仅采用了6nm工艺&#xff0c;更加强大的算力和优越的性能&#xff0c;能够轻松实现多任务运行&#xff0c;不会出现卡顿现象。 此外&#…

算法随想录第四十八天打卡| 198.打家劫舍 , 213.打家劫舍II , 337.打家劫舍III

详细布置 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 代码随想录 class Solution(…

Pytest测试用例参数化

pytest.mark.parametrize(参数名1,参数名2...参数n, [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)]) 场景&#xff1a; 定义一个登录函数test_login,传入参数为name,password&#xff0c;需要用多个账号去测试登录功能 # …