随笔分类 - Python高级
摘要:所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知。 Asyncio 是并发(concurrency)的一种方式。对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现。 Async
阅读全文
摘要:__new__与__init__的理解 __new__()方法是在创建实例之前被调用的,它的作用是创建一个实例,然后返回该实例对象,它是一个静态方法。 __init__() 当实例被创建完成之后被调用的,然后设置对象属性的一些初始值,是一个实例方法。 也即:__new__先被调用,__init__后
阅读全文
摘要:当用Queue进行通信的时候,如果put进queue的时候有延迟,而get方法一直在运行的时候,如果用了while queue.qsize()!=0:来运行get则可能会出现put还没来得及进入,get就已经去Queue中取数据,所以queue.qsize()==0,导致退出循环了,这样后面再put
阅读全文
摘要:创建一个线程池: Future对象的理解: 在我们创建submit()的时候会立即返回一个future对象,这个对象可能是没有完成的,但是会在将来某个时候完成,所以它是一个未来对象,或者叫做task的返回容器,保存task的执行状态及执行结果。(注意future与task的区别) 看submit()
阅读全文
摘要:先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统
阅读全文
摘要:并发 在一个时间段内,有几个程序在同一个cpu上面运行,但是任意时刻只有一个程序在cup上运行。(一个cpu在一个时间点上只能运行一个程序,因为cpu的运算速度非常快,可达上亿次每秒,如在一秒内可以切换100个进程时,但是因为我们感觉不出cpu的切换,所以错觉是几个程序在同时运行的) 并行 指的是在
阅读全文
摘要:协程 在python3.5以前,写成的实现都是通过生成器的yield from原理实现的, 这样实现的缺点是代码看起来会很乱,于是3.5版本之后python实现了原生的协程,并且引入了async和await两个关键字用于支持协程。于是在用async定义的协程与python的生成器彻底分开。 可以看到
阅读全文
摘要:相关概念 相关概念 并发:指一个时间段内,有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行。比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100。 并行:值任意时刻点上,有多个程序同时运行在cpu上,可以理解为多个cpu,每个cpu独立运行自己程序,互不干扰。
阅读全文
摘要:生成器对象是一个迭代器。但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法。这些方法,主要是用于外部与生成器对象的交互。本文先介绍send方法。 send send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值。这样说起来比较抽象,看下面的例子。
阅读全文
摘要:进程运行时候变量是隔离的,线程间共享全局变量。 进程: 线程: 进程与线程的Queue 线程用的消息队列 from queue import Queue 进程用的消息队列 from multiprocessing import Queue 进程池用的消息队列(不能用from multiprocess
阅读全文
摘要:GIL 全称global interpreter lock 全局解释锁 gil使得python同一个时刻只有一个线程在一个cpu上执行字节码,并且无法将多个线程映射到多个cpu上,即不能发挥多个cpu的优势。 gil会根据执行的字节码行数以及时间片释放gil,也会在遇到IO操作时候主动释放。 线程
阅读全文
摘要:python中函数调用的实质原理: python中函数调用的实质原理: python解释器(即python.exe)其实是用C语言编写的, 在执行python代码时,实际上是在用一个叫做Pyeval_EvalFramEx(C语言的函数)去执行代码中的函数,(实际上python中的程序实际上是运行在C
阅读全文
摘要:属性描述符可以用来控制给属性赋值的时候的一些行为 此代码中自定义的IntField类就是属性描述符类,属性描述根据其实现的魔法方法分为数据描述符和非数据描述符,两者的优先级别不一样。如果定义了属性描述符,那么在下面的类中定义属性的时候,如果属性是属性描述符的实例,那么再给属性赋值的时候就会先调用属性
阅读全文
摘要:考察 Student 类: 当我们想要修改一个 Student 的 scroe 属性时,可以这么写: 但是也可以这么写: 显然,直接给属性赋值无法检查分数的有效性。 如果利用两个方法: 这样一来,s.set_score(1000) 就会报错。 这种使用 get/set 方法来封装对一个属性的访问在许
阅读全文
摘要:python中的垃圾回收采用计数算法 一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象。 在函数和类中如果传递参数的时候,很有可能参数会做一些改变,一下为一个经典的坑: 代码解释:在因为com2没有指定list参数于是调用的默认参数。默认参数可以用print(Co
阅读全文
摘要:变量的存储 a = 'abc' 理解:①先在内存中生成一个字符串‘abc’ ②可以把比变量名a看做一个便利贴,然后将a贴到‘abc’中 ③注意顺序,是生成‘abc’,然后再创建a指向‘abc’ python的is 和==的区别 is用来判断两个对象的ID是否一样 上述代码中之所以a == b成立,是
阅读全文
摘要:在python的dict中间进行查找某个key操作时,查找所需时间不会随着dict中键值对数量增多而变长,(时间复杂度为O(1))但是list中就会(时间复杂度为O(N)),这是因为list查询实现的方式是循环遍历所有列表,然后查找对应的元素,所以列表中元素越多,查找越费时间,但是同一个dict中的
阅读全文
摘要:列表推导式 含义:通过一行代码生成列表,列表生成式性能高于列表操作。如果代码逻辑不复杂情况下可以优先使用列表生成式。 提取1-21之间的偶数 a = [x for x in range(21) if x%2==0] 生成器表达式 a = (x for x in range(21) if x%2==0
阅读全文
摘要:bisect.insort(序列,元素)用于向序列中添加元素,并实现序列中元素的自动排序。 bisect.bisect(序列, 元素) 用于做查找,即如果插入元素,返回该元素应该插入的位置。如果元素相等,默认插入相等元素的右边,如果想要插入相当元素的左边,可用bisect.bisect_left(序
阅读全文
摘要:创建一个可切片类 最后一行做调试如下: 类中因为实现了__getitem__()方法,可以看到对类的实例group对象切片操作之后,返回list类型的sub_group(),但是如果想使得切片之后的对象的话还是一个Group()则需要更改__getitem__()如何更改呢?我们需要了解其参数ite
阅读全文

浙公网安备 33010602011771号