自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 收藏
  • 关注

原创 对asyncio应用程序进行简单性能分析

了解协程调用过程中消耗的内存和时间。在这里性能分析(profiling)是度量程序执行效果的非功能参数。为了实现性能分析,Python标准库在PEP 454种概述tracemalloc模块。tracemalloc模块是在CPython解释器中引入,因为需要一个用于Python的内存监控API。

2023-02-07 16:33:04 201 1

原创 Python asyncio记录Task(协程,任务)的执行时间

协程是asyncio的一等公民。他们使用Task对象在事件循环中进行各种操作。实现一个MonitorTask封装器,来记录Task的执行时间。我们想要执行Task任务运行的具体时间。

2023-02-07 16:30:11 503

原创 Python 使用future处理并发

从Python3.2引入的concurrent.futures模块,Python2.5以上需要在pypi中安装futures包。future指一种对象,表示异步执行的操作。这个概念的作用很大,是concurrent.futures模块和asyncio包的基础。

2023-02-03 23:38:19 1753

原创 Python 协程详解

yield item这行代码会产出一个值,提供给next()的调用方;此外还会做出让步,暂停执行生成器,让调用方继续工作,知道需要使用另一个值再调用next()。调用方会从生成器中拉取值。从语法上来看,协程与生成器类似,都是从定义体中包含yield关键字的函数。可是,在协程中,yield通常出现在表达式的右边(如data = yield),可以产出值,也可以不产出:如果yield关键字后面没有表达式,那么生成器产出None。

2023-02-03 23:26:07 809 1

原创 Python 上下文管理器

with语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下问题。这样做能避免错误并减少样板代码,因此API能更安全,更易使用。除了自动关闭文件之外,with块还有很多用途。

2023-01-31 23:50:56 185

原创 Python else子句在for、while、try语句中使用

else子句不仅在if语句中使用,还可以用在for、while、try中使用,但是没有得到重视,因为和if/else的差别很大,else这个单词的意思阻碍了对特征的理解。else的含义是“排他性”这层意思:“要么运行这个循环,要么做那件事”,但是在for和while循环中,else的语义正好相反:“运行完这个循环,然后做这件事”所以根据英文含义,使用then关键字更好,在for、while、try语句中也就说得通:比如在try中“尝试运行这个,然后做这件事”示例,else的简单使用。

2023-01-31 23:48:20 887

原创 Python可迭代对象、迭代器和生成器

迭代是数据处理的基石。内存中放不下的数据集,我们要找到一种惰性获取数据的方式,即一次获取一个数据项,这就是迭代器模式在Python2.2加入了yield关键字,这个关键字用于构建生成器(generator),其作用和迭代器一样。所有的生成器都是迭代器。因为生成器完全实现了迭代器接口。迭代器用于从集合中取出元素。生成器用于“凭空”生成元素。比如斐波那契数列中的数有无数个,在集合中放不过下。在Python社区中,大多数时候都把迭代器和生成器视为同一概念。

2023-01-31 23:46:05 372

原创 Python 正确重写运算符(重载)

运算符重载的作用是让用户定义的对象使用中缀运算符(如+和|)和一元运算符(如-和~)。在Python中,这些也算是运算符:函数调用:()属性访问:.元素访问和切片:[]

2023-01-31 23:37:37 1914 1

原创 Python继承的优缺点

推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架!

2023-01-31 00:04:58 355

原创 Python:从协议到抽象基类

本章话题是接口:鸭子类型代表特征动态协议; 使接口更明确、能验证实现是否副了规定的抽象基类ABC(Abstact Base Class).Python语言诞生15年后,Python2.6中才引入了抽象基类,抽象基类。对于java、C#类似的语言,会觉得鸭子类型的非正式协议很新奇。抽象基类于描述符和元类一样,是用于构建框架的工具。其实很多时候Python开发者编写的抽象基类会对用户施加不必要的限制,做无用功。

2023-01-31 00:01:31 372

原创 进阶:Python序列的修改、散列和切片

​将以上一篇文章中二维向量Vector2d类为基础(文章链接:进阶:编写符合Python风格的对象_lijiachang8的博客-CSDN博客),定义表示多维向量的Vector类。这个类的行为与Python中标准的不可变扁平序列一样。​

2022-08-19 19:18:25 734

原创 进阶:编写符合Python风格的对象

得益于Python数据模型,自定义类型的行为可以像内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子模型(duck typing)。使用Python的特殊方法,实现一个Pythonic的向量类

2022-08-19 19:10:44 362 1

原创 Python 对象引用、可变性和垃圾回收

简单的赋值不会创建副本。而是增加了别名。对于+=或者*=这种增量赋值来说,如果左边的变量绑定是不可变对象,会创建新对象;如果是可变对象,会就地修改。为现有的变量赋予新值,不会修改之前绑定的变量对象。这叫重新绑定:现在变量绑定了其他对象。如果变量是之前那个对象的最后一个引用,对象会被当做垃圾回收。函数的参数以别名传递。这意味着函数可以修改通过参数传入的可变对象。除非在函数内创建副本,或者使用不可变对象,否则无法避免。使用可变类型作为函数的参数的默认值很危险,如果就地修改了参数,默认值也就变了,这会影响

2022-08-19 18:56:14 284

原创 asyncio使用事件(Event)处理通知 Python asyncio.Event

asyncio Event事件旨在向多个协程发出信号,因此协程方法可被阻塞,直到Event被“设置”为止。使用事件循环构建一个清理模式:打印INFO:root:adding mess: 43INFO:root:adding mess: 43INFO:root:adding mess: 78INFO:root:adding mess: 18INFO:root:adding mess: 68INFO:root:adding mess: 34INFO:root:adding mess:

2022-06-06 20:56:48 1250

原创 Python 函数装饰器和闭包

函数装饰器和闭包函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为,用闭包实现。nolocal是在Python3.0新增的保留关键字。闭包除了在装饰器中有用之外,还回调式一步编程和函数式编程风格的基础。装饰器基础,何时执行装饰器装饰器是可调用对象,参数是另一个函数(被装饰的函数)。函数装饰器再导入模块是立即执行,而被装饰的函数只有在调用时运行。装饰器通常在一个模块中定义,然后应用到其他模块中的函数上。registry = []def register

2022-04-16 13:31:44 797

原创 Python一等函数实现设计模式

策略模式策略模式是一个经典的模式,简化代码。电商领域有个功能明细可以使用“策略”模式,就是根据客户的属性或订单中的商品计算折扣。比如一个网店,指定了以下的折扣规则, 并且一个订单只能享受一个折扣:有1000积分以上的顾客,整个订单可以享受5%的折扣 同一个订单中,单个商品的数量达到20个以上,单品享受10%折扣 订单中不同商品的数量达到10个以上,整个订单享受7%折扣下面是UML类图:上下文:把一些计算委托给实现不同算法的可互换组建,他们提供服务。 在这个示...

2022-04-16 12:39:43 576

原创 asyncio 多进程加协程,在一个进程内运行一个事件循环

方案1 使用os.fork 仅适用于Unix在进程之间共享一个字典,它保存每个进程ID和事件循环实例。import asyncioimport ospid_loops = {}def get_event_loop(): return pid_loops[os.getpid()]def asyncio_init(): pid = os.getpid() if pid not in pid_loops: pid_loops[pid] = a..

2022-04-16 12:34:24 1406

原创 asyncio 多线程附加协程,在一个线程内运行一个事件循环

使用threading.Thread 和asyncio.new_event_loop 我们可以创建具有唯一事件循环实例的线程实例。import asyncioimport threadingdef creat_event_loop_thread(worker, *args, **kwargs): """""" def _worker(*args, **kwargs): loop = asyncio.new_event_loop() asynci

2022-04-16 12:32:21 1193

原创 Python的一等对象:函数

‘一等对象’定义:在运行时创建 能赋值给变量或者数据结构中的元素能作为参数传递给函数 能作为函数的返回结果在python中,整数,字符串,字典都是一等对象。但是在python中函数也符合以上特征,所有函数都是一等对象。示例,实现阶乘def factorial(num): """阶乘实现 :一个正整数的阶乘是所有小于及等于该数的正整数的积,并且有0的阶乘为1。""" return 1 if num <= 1 else num * factorial(num -

2021-12-08 18:43:06 791

原创 Python3的str文本和bytes字节序列 Unicode介绍

python3的str对象中获取的元素是Unicode字符,这相当于从python2中的unicode对象中获取元素,而不是从python2的str对象中获取原始字节序列python3的str类型基本相当于python2的unicode类型。把码位转换成字节序列的过程是编码。 encode (把字符串转换成用于存储或者传输的字节序列)把字节序列转换为码位的过程是解码。 decode (把字节序列变成人类可读的文本字符串)s = 'café'b = s.encode('utf-8')

2021-12-08 18:38:42 1450

原创 Python 字典和集合的的实现:散列表

字典和集合的效率高,和他背后的散列表是绕不开的。散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。散列表的单元叫做表元bucket。在dict的散列表中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对于值的引用。因为表元的大小一致,所以可以通过偏移量来读取表元。python会保证大概有三分之一的表元是空的,快要达到这个阈值的时候,原有的散列表会被复制到一个更大的空间里面。散列值的相等:内置的hash()方法是调用对象的__hash__。如果两个对象比较

2021-10-26 10:45:12 393

原创 Anaconda3环境使用TensorFlow报错解决记录 mistGPU

先上总结主要是由于代码是基于tensorflow1.0编写的,目前最新的版本是2.0,版本更新比较大,很多方法已经改名,或者弃用。为确保高版本的TF支持低版本的TF代码,升级脚本加入了 compat.v1 模块。此模块将以等效的 tf.compat.v1.foo 引用代替表单 tf.foo 的调用。不过,建议您手动检查此类替代方案,并尽快将其迁移至 tf.* 命名空间(代替 tf.compat.v1.* 命名空间)中的新 API。还有一些其他模块,新的版本中方法名有所变动

2021-09-17 15:52:22 3444

原创 Python的集合set简介

11. 集合set和它的不可变类型frozenset直到python2.6版本中才成为内置类型,是比较年轻的。集合的本质是许多唯一对象的聚集。集合的所有元素必须是可散列的。set类型本身是不可散列的,因为可以增删元素。但是不可变集合frozenset是可散列的。所以可以创建一个包含不同frozenset元素的set。集合实现了很多基础的中缀运算符,不仅可以减少代码量,还可以减少python的运行时间:a|b 返回他们的合集 a.union(b, ...) 就地修改 a|=ba...

2021-04-22 22:31:00 121

原创 Python中不可变的字典(映射类型)。

不可变映射类型在有些场景中,比如不能用用户错误的修改某个映射,所以需要一种不可变的字典。在Python3.3开始,types模块中新增了一个封装类MappingProxyType。给这个类一个映射,他会返回一个只读的映射视图。虽然这个视图是只读的,但是动态的,意思是如果修改了原映射对象,这个映射视图也能够改变,但是无法直接修改映射视图。from types import MappingProxyTypea_dict = {'x': 1, 'y': 2}a_view..

2021-04-22 22:27:38 727

原创 Python继承字典dict,请使用UserDict 作为基类

仅python3可用。UserDict 这个类是把标准的Dict用纯python又实现了一遍。是让用户写子类的。如果想要创建自定义映射类型,以UserDict作为基类,比dict要方便的多UserDict 不是继承自dict。但是UserDict有个data的属性,是dict的实例,是用于存储数据的地方。UserDict是继承自MutableMapping。使用UserDict作为基类,完成一个自定义字典from collections import UserDictc.

2021-04-22 22:23:44 3857

原创 Python字典的变种 OrderDict、ChainMap、Counter

在collection模块中,除了defaultdict之外,还有不同的映射类型。OrderDict 有序字典:特殊的popitem方法默认删除字典的最后一个元素,如果是odict.popitem(last=False)调用,会删除并返回第一个添加的元素ChainMap 合并多个字典(映射对象) 仅python3可用:假如你有如下两个字典,在两个字典中执行查找操作(比如先从 a 中找,如果找不到再在 b 中找)。 一个非常简单的解决方案就是使用 collections 模块中的...

2021-04-22 22:20:37 350

原创 Python映射类型对象的特殊方法__missing__

所有的映射类型在找不到键的时候,就会调用__missing__方法。如果一个类继承了dict,那么继承类也会提供__missing__方法,在__getitem__时(也就是使用dict[key]取值)找不到键的情况,Python就会自动调用__missing__,而不是抛出KeyError异常。所以,__missing__方法对get和__contains__(in运算符会用到这个方法)这些方法的使用无影响!示例,自定义个映射类型:在查询的时候把非字符串的键,转换为字符串。c...

2021-04-19 22:05:32 344

原创 Python处理字典找不到的键defaultdict(默认值字典)

映射方法除了dict,还有常见的OrderDict(有序字典)、defaultdict(默认值字典),他们的方法基本相同,只有个别差异。比如defaultdict 实现了一个d.__missing__(k)方法,当d.__getitem__(k)找不到对应键的时候,就会被调用。__getitem__(k)这个方法,就是d[k],对字典使用中括号的时候调用。创建一个defaultdict,处理找不到的键。collection.defaultdict 是在创建字典对象的时候,需要配置一个找.

2021-04-19 21:54:36 1732

原创 Python字典的setdefault()方法来处理找不到的键:统计记录每个单词出现的次数和坐标

字典的setdefault()方法,来处理找不到的键。此方法总会让字典返回key对应的value,如果字典中有对应的key就从字典中取值,如果没有对应的key就会把value设置default,然后再返回。注意,这样字典中已经增加了新的键值对实例:记录每个单词出现的次数和坐标import rewords_count = {}with open('en_words.txt', 'r', encoding='utf-8') as f: for line_num, line .

2021-04-19 21:42:34 291

原创 Python的映射类型介绍

dict类型是Python语言的基石,至关重要。Python对它做了高度优化,散列表是字典类型性能出众个跟本原因。collection.abc 模块里面有Mapping和MutableMapping这两个抽象基类,他们的作用为dict和类似的类型提供形式接口。其他的映射类型,一般不会直接继承这两个抽象基类,会直接对dict就行扩展。from collections import abcprint(isinstance({}, abc.Mapping))print(isinstance({},

2021-04-19 21:33:52 1768

原创 Python中列表并不是首选,其他序列类型介绍:数组、内存视图、NumPy 、双向队列deque

数组array.array比如我们要存放100万个浮点数的话,使用数组就会更高效一点,因为数组背后存储是不是float对象,而是数字对应的机器翻译,也就是字节表述。数组支持所有可变序列的操作,比如.pop .insert .extend。另外还支持从文件读取和写入更快的方法:.fromfile和.tofile frombytes和tobytes。创建数组,第一个参数需要类型码,用来表示C语音底层如何存放的数据类型,比如arra('b'),B类型码就是signed char 只能存放一个...

2021-04-18 17:39:56 198

原创 Python 的bisect模块: 有序序列的查找和插入

查找位置:bisect(array,new_item)import bisecta = [1, 2, 4, 8, 12, 14, 19]item = 13position = bisect.bisect(a, item)print(position) # 如果放到有序序列中,应该存在的索引位置# 使用列表的insert方法插入对应位置a.insert(position, item)print(a)结果:5[1, 2, 4, 8, 12, 13, 14, 19]有序插入

2021-04-18 17:23:46 448

原创 Python的list.sort方法 和 sorted函数

不同点:list.sort方法是就地排序,不会把源列表复制一份,返回值是None。python中就地改动都会返回None。sorted函数,新建一个列表作为返回值,参数可以是不可变序列,或者是生成器,最后总会返回一个列表。共同点:reverse ,默认为FALSE,改为True会降序,从大到小。 key,排序算法...

2021-04-18 17:19:30 118

原创 Python序列的增量赋值+= *=

增量赋值运算符 +=和*= 一般作用于可变序列上如果对于不可变序列(如tuple), 每次都会生成一个新的对象,效率就很低。+= 对应的方法__iadd__就地加法。如果一个类没有实现,python会退一步调用__add__a +=b以上实例中,如果a实现了__iadd__方法,对于可变序列(list、bytearray、array.array)来说,a会就地改动,等于调用了a.extend(b)。如果没有实现__iadd__就是等于a = a+b 先计算a+b等到一个新的对象..

2021-04-17 15:45:47 303

原创 Python切片 slice() 对切片赋值、嫁接、修改

seq[start:stop:step] 通常最后一个step是省略的默认为0。在start和stop之间以step为间隔取值python会调用seq.__getitme__(slice(start,stop,step))s = 'bicycle'切片s[::3] 结果:bye 这里注意是间隔,所以要从索引0的b开始,依次往后三个数切片s[::-2] 结果:eccb step负数倒着数,不要忘记从索引0开始slice()方法对序列类型使用sl...

2021-04-17 15:43:10 431

原创 Python元组作为记录,元组拆包,命名元组namedtuple

元祖作为记录元祖其实是对数据的记录,元祖的每个元素存放了记录中字段的一个数据,外加这个字段的位置。也就是位置是有含义的lax_coordinates = (33.94, -118.40) # 一个经纬度city, year = ('Tokyo', 2003) # 赋值 拆包traveler = ('USA', '311') # 地区信息print('%s/%s' % traveler) # %的匹配print('{}/{}'.format(*traveler)) # 拆包.

2021-04-17 15:19:56 226

原创 Python对象的表示形式 __str__和__repr__

获取对象的字符串表示形式的标准方式,Python提供了两种。repr() :返回便于开发者理解的方式返回对象的字符串,用__repr__实现 str():返回便于用户理解的方式返回对象的字符串,用__str__实现其他的表示形式,还有:__bytes__:类似于__str__方法,bytes()函数调用它获取对象的字节序列表示形式。 __format__:会被内置的format()函数和str.format()方法调用,适应特殊的格式代码显示对象字符串表示形式。ps:在Python3中.

2021-04-16 21:55:10 114

原创 Python的弱引用、控制台的_变量、WeakValueDictionary的介绍

弱引用因为有引用,对象才能在内存中存在。当对象的引用数量归零后,垃圾回收程序会把对象销毁。但是有时候需要引用对象,但是不想影响对象的生命周期,这经常用在缓存中。弱引用不会增加对象的引用数量。引用的目标对象称为所指对象(referent)。因此弱引用不会妨碍所指对象被当做垃圾回收。弱引用在缓存应用中很有用,因为我们不想因为缓存占用着对象,而不被回收。使用weakref.ref获取所指对象的弱引用。如果对象存在,调用弱引用可以返回对象,否则返回None。示例,使用weakre..

2021-04-16 21:52:52 794 1

原创 Python的del和垃圾回收

对象绝不会自行销毁;然而,无法得到对象时,可能会被当做垃圾回收。del语句是删除名称,而不是对象。del语句可能会导致对象被当做垃圾回收,但是仅当删除了变量保存的是对象的最后一个引用,或者是无法得到对象的时候(比如两个对象相互引用)。还有就是重新绑定也可能导致对象的引用数量归零,导致对象被销毁。在即将销毁实例时,Python解释器会调用__del__方法,给实例最后的机会,让其释放外部资源。自己编写的代码很少需要用到__del__代码,因为__del__很难用,费力不讨好。在CPyth.

2021-04-16 21:48:38 583

原创 Python列表推倒的知识点:变量泄露、列表推导代替filter和map函数、生成笛卡尔积、生成器表达式

列表推导的变量泄露问题在python2.x中,列表推导中的关键字可能会影响上下文的同名变量:在python3中不会有问题,推导式,生成式,在python3中有了自己的局部作用域,就像函数一样。列表推导代替filter和map函数filter和map组合,不一定比列表推导式快,而且列表推导的可读性会更好一些。列表推导实现:symbols = 'asdfgjk'ascii = [ord(x) for x in symbols if ord(x) > 127...

2021-04-15 22:26:03 243

linux下MySQL-cluster集群搭建.

MySQL-cluster集群搭建.

2017-08-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除