首页 > 其他分享 >猴子补丁?是什么?

猴子补丁?是什么?

时间:2023-10-30 11:04:31浏览次数:26  
标签:什么 补丁 猴子 dumps json dict time import ujson

一、什么是猴子补丁?

猴子补丁:Monkey Patch,主要功能就是动态的属性的替换,模块运行时替换的功能。说直接点就是程序功能的追加或者变更。

二、Monkey Patch功能简介

Monkey Patch允许在程序运行期间动态的修改一个类或者模块。

三、举个例子

之前一个做游戏的,在很多地方都用了**import json后来发现ujson比Python自带的json快很多,于是问题来了,几十几百个文件难道要一个一个的把import json替换成import ujson as json吗?那也太痛苦了,其实只需要在进程开始的地方使用monkey patch**就行了,它是会影响整个进程空间的,同一进程空间中一个module只会被执行一次。


"""
file:json_serialize.py
"""
import time
import json

# 时间测试装饰器
def run_time(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'程序用时:{end_time - start_time}')
        return result

    return inner

@run_time
def json_dumps(obj):
    return json.dumps(obj)

# 生成测试字典
test_dict = {i: 1 for i in range(1, 10000001)}

使用json模块执行原程序:

"""
file:run.py
"""
from json_serialize import json_dumps, test_dict

print(f'json.dumps编码用时:', end='')
r1 = json_dumps(test_dict)

原程序的性能太低,我们可以使用ujson将json替换掉!

使用monkey patch修改后:

"""
file:run.py
"""
import json
import ujson
from json_serialize import json_dumps, test_dict

def monkey_patch_json():
    json.dumps = ujson.dumps

monkey_patch_json()
print(f'使用猴子补丁之后json.dumps编码用时:', end='')
json_dumps(test_dict)

这个时候在这个项目中json模块就被monkey patch修改为了ujson模块。

标签:什么,补丁,猴子,dumps,json,dict,time,import,ujson
From: https://blog.51cto.com/u_15739596/8086493

相关文章

  • var,let,const有什么不同
    var、let和const是JavaScript中的关键字,它们用于声明变量或常量。它们的主要区别在于作用域规则、块级作用域和声明的变量是否可以重新赋值。作用域规则:var:在声明变量时拥有函数作用域或全局作用域。这意味着在函数内部用var声明的变量在函数外部也是可以访问的,同时它......
  • 小鳄鱼问爸爸说,很多人没看见过狮子,为什么都在骂狮子? 爸爸说,我们鳄鱼骂狮子,是为了自
     小鳄鱼问爸爸说,很多人没看见过狮子,为什么都在骂狮子?爸爸说,我们鳄鱼骂狮子,是为了自己的权力,让动物们拥护自己;蛤蟆们骂狮子,是为了讨好我们;鸟雀们骂狮子,是为了流量。其他的动物们,则拥有了惧怕,骄傲,仇恨这三个法宝,他们的后代就会从小骂狮子了。 ......
  • MAC地址和IP地址都有什么作用?为什么有了MAC地址还需要IP地址?为什么有了IP地址还需要MA
    MAC地址和IP地址都有什么作用?MAC地址是数据链路层和物理层使用的地址,是写在网卡上的物理地址,用来定义网络设备的位置,不可变更。IP地址是网络层和以上各层使用的地址,是一种逻辑地址。IP地址用来区别网络上的计算机。为什么有了MAC地址还需要IP地址?如果我们只使用MAC地址进行寻址的......
  • java中方法内的局部变量是在什么时候被创建的
    2023.10.291.不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”。栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出......
  • 为什么重写equals方法时一定要重写hashCode方法
    为什么重写equals方法时一定要重写hashCode方法在每个类中,在重写equals方法的时侯,一定要重写hashcode方法。根据Object规范,规范约定:如果两个对象通过equals方法比较是相等的,那么它们的hashCode方法结果值也是相等的。如果两个对象通过equals方法比较是不相等的,那么不要求它......
  • 为什么大模型计算的时候只会利用KVcache来存放KV矩阵,Q矩阵每次不一样?
    大型神经网络计算中使用KVCache(Key-Value缓存)的概念主要涉及于注意力机制(self-attentionmechanism),通常用于Transformer架构中。KVCache的目的是为了减少计算复杂性,提高效率,并节省计算资源。这涉及到Transformer的推理(inference)阶段,而不是训练(training)阶段。在Transformer中,自注......
  • **(双星号/星号)和 *(星号/星号)对参数有什么作用?
    内容来自DOChttps://q.houxu6.top/?s=**(双星号/星号)和*(星号/星号)对参数有什么作用?在以下函数定义中,*args和**kwargs分别表示什么意思?deffoo(x,y,*args):passdefbar(x,y,**kwargs):pass关于参数的补充问题,可以参考Whatdo**(doublestar/asteris......
  • 什么情况下你会使用AI工具(chatgpt、bard)?
    在当今数字化和智能化的时代,AI工具已成为许多领域的常见工具。在本文中,我将探讨什么情况下会使用AI工具。ChatGPT是一款由OpenAI开发的大型语言模型,可以生成文本、翻译语言、编写不同类型的创意内容,并以信息丰富的方式回答你的问题。它是目前最先进的聊天机器人之一,具有广泛的应用......
  • LongAdder为什么在高并发下保持良好性能?LongAdder源码详细分析
    文章目录一、LongAdder概述1、为什么用LongAdder2、LongAdder使用3、LongAdder继承关系图4、总述:LongAdder为什么这么快5、基本原理二、Striped64源码分析1、Striped64重要概念2、Striped64常用变量或方法3、静态代码块初始化UNSAFE4、casBase方法5、casCellsBusy方法6、getProbe......
  • Spring为什么建议构造器注入?看看和你所理解的一样吗?
    Spring框架鼓励使用构造器注入的主要原因是出于设计原则和最佳实践的考虑,这有助于提高代码的可维护性、可测试性和整体质量。以下是详细说明为什么Spring建议构造器注入以及相关实例代码:1.易于测试构造器注入使得对类的单元测试变得更加容易。通过将依赖项作为构造函数的参数传递,......