随笔 - 229
文章 - 0
评论 - 10
阅读 -
26万
12 2019 档案
MySQL索引及数据结构
摘要:Hash索引 (1) 它会使用到hash函数,算出一个确切的值 , 如果key发生变化. hash值也会跟着发生变化. 而且还存在着hash冲突的情况. (2) 联合索引的情况 hash(id+name) = hash值 , 不能支持 部分索引查询和范围查找. 红黑树 (1) 树太高,读取磁盘的次数
阅读全文
JDK8 HashMap源码分析
摘要:HashMap需要注意以下几方面 (1) HasMap底层是用Node数组table存储数据, 它是采用懒加载的方式初始化的, 初始长度16, 加载因为0.75, 每次扩容2倍, 在扩容时,移动节点都是采用尾插法. 而JDK8之前都是采用的头插法(这里有个典型的问题,多线程可能死循环). (2) J
阅读全文
红黑树
摘要:常见算法与数据结构暴力:二分: 前提,有序 , 时间复杂度O(lgn) > 转换成数据结构: 二叉树(二叉查找树,二叉搜索, 二叉有序树)哈希: 最高效 , O(1), hash冲突 , jdk1.8 hashmap中的数据结构: 链表+红黑树(处理hash冲突的)插值索引: 搜索引擎 ,Lucen
阅读全文
协程
摘要:进程和线程都是由操作系统控制调度的, 协程是是函数级别的调度,可以由程序员写代码控制 python中使用async和await两个关键字来支持原生协程 # python后期使用async和await两个关键字来定义协议, 这样就可以与生成器表示区别开来, 语义也更加明确 # 底层也是使用生成器来实现
阅读全文
yield from语法的高级特性
摘要:def gen(): """子生成器""" yield 1 def gen1(gen): """委托生成器""" yield from gen def main(): """调用方""" g = gen() g1 = gen1(g) g1.send(None) # 启动生成器 上面的代码有3个角色,
阅读全文
yield from语法应用
摘要:yield from 是python3.3中新增的语法, 语法结构: yield from iterable 在上一篇文章中自定义了一个my_chain函数,现在可以yield from方法对其进行精简 # 自定义一个chain def my_chain(*args, **kwargs): """注
阅读全文
yield的应用:多个可迭代对象联合遍历
摘要:使用itertools工具类中的chain方法,可以很方便的将多个iterable对象一起遍历. 不过,对于dict类型的iterable对象,只会遍历key. from itertools import chain my_list = [1, 2, 3] my_dict = { 'name': '
阅读全文
dict字典元素按key或者value进行排序
摘要:使用python内置的sorted方法,可以很方便的对dict元素排序 if __name__ == '__main__': my_dict = {} my_dict['CD'] = 12 my_dict['XA'] = 60 my_dict['BJ'] = 15 my_dict['GZ'] = 1
阅读全文
list排序
摘要:使用sort方法,可以将list中的元素按自定义属性进行排序 class Person(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): return 'name:{}
阅读全文
生成器高级特性2
摘要:生成器除了前面提到的send方法传参之外,还有两个比较重要的方法 close() : 关闭生成器. 关闭生成器之后,如果后面还想从生成器中值 ,会报错 throw() : 传个异常到生成器内部 def gen_func(): yield 1 yield 2 yield 3 if __name__ =
阅读全文
time时间库使用示例
摘要:time时间库主要有以下几个方法 1. 生成struct_time ,然后就可以很方便的获取到年月日,时分秒等信息 time.localtime() 2. 生成时间戳 time.time() 3. 将struct_time 转成指定格式的时间字符串 time.strftime(format,stru
阅读全文
生成器的高级特性
摘要:生成器不但可以产出值 ,还可以接收调用方的入参 举个例子 def gen_fun(): # 这种方式 ,即可产出值 ,也可以接收调用传进来的参数 html = yield "http://www.baidu.com" print(html) # 这种方式就只能产出值,不能接收调用方入参 yield
阅读全文
fabric报错:Fatal error: run() received nonzero return code 1 while executing!
摘要:今天在使用fabric远程安装rpm时,一直报:Fatal error: run() received nonzero return code 1 while executing! 这看起来也是没笔病呀,但fabric就是这么蛋疼, 它在执行过程中, 如果执行命令返回非零, 就会中断后面的逻辑. 解
阅读全文
ReentrantReadWriteLock源码分析笔记
摘要:ReentrantReadWriteLock包含两把锁,一是读锁ReadLock, 此乃共享锁, 一是写锁WriteLock, 此乃排它锁. 这两把锁都是基于AQS来实现的. 下面通过源码来看看ReentrantReadWriteLock是如何做到读读共享,读写互斥的. 1. 测试代码 import
阅读全文
公平锁与非公平锁
摘要:在使用ReentrantLock创建锁实例时,即可以创建公平锁,也可以创建非公平锁.默认是创建非公平锁. Lock lock = new ReentrantLock(true); // 创建一个公平锁 无论是创建公平锁,还是创建非公平锁,其底层都是使用AQS来实现的, 唯一的不同,就是非公平在加入C
阅读全文
select编程[回调+事件循环]
摘要:感觉比java写起来还要忧伤..... """ select , poll,epoll 注意: epoll并不一定比select的性能好,这需要看场景 1. 在高并发场景,且连接活跃度不是很高的时候,epoll比select好, 比如web应用 2. 在并发不高,但连接很活跃的场景下,select
阅读全文
AQS源码分析笔记
摘要:经过昨晚的培训.对AQS源码的理解有所加强,现在写个小笔记记录一下 同样,还是先写个测试代码,debug走一遍流程, 然后再总结一番即可. 测试代码 import java.util.concurrent.CyclicBarrier; import java.util.concurrent.lock
阅读全文
进程间通信的4种方式
摘要:python提供了4种方式来满足进程间的数据通信 1. 使用multiprocessing.Queue可以在进程间通信,但不能在Pool池创建的进程间进行通信 2. 使用multiprocessing.Manager.Queue可以在Pool进程池创建的进程间进行通信 3. 通过Pipe进行线程间的
阅读全文
多进程编程
摘要:在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式. 下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 import multiprocessing import time def get_html(n): time.sleep(n) print('sub pr
阅读全文
多线程与多进程的比较
摘要:多线程适合于多io操作 多进程适合于耗cpu(计算)的操作 # 多进程编程 # 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程 import time from concurrent.futures import ThreadPoolExecutor, as_completed f
阅读全文
线程协作之threading.Condition
摘要:领会下面这个示例吧,其实跟java中wait/nofity是一样一样的道理 import threading # 条件变量,用于复杂的线程间同步锁 """ 需求: 男:小姐姐,你好呀! 女:哼,想泡老娘不成? 男:对呀,想泡你 女:滚蛋,门都没有! 男:切,长这么丑, 还这么吊... 女:关你鸟事!
阅读全文
锁
摘要:别看pyhton有个GIL,但是在多线程编程时与java一样,为了保证数据的案例,还是需要用到锁Lock锁. Lock不是重入锁,在同一个线程中不能多次acquire() RLock才是重入锁 import threading from threading import Lock # 申明一把锁 l
阅读全文
GIL锁
摘要:global interpreter lock 金局解释锁, 使得同一时刻只有一个线程在cpu上执行python的字节码文件,无法将多个线程映射到各个cpu上执行. gil会根据执行的字节码行数或cpu时间片,或io操作,会主动释放gil锁 import threading total = 0 de
阅读全文
使用生成器读取一个超大文件
摘要:pyhon读取文件很方便,但是,如果文件很大,而且还是一行文件,那就蛋疼了. 不过还好有read(size)方法,这个方法就是每次读取size大小的数据到内存中 下面来个示例 def readlines(f, separator): ''' 读取大文件方法 :param f: 文件句柄 :param
阅读全文
生成器原理介绍
摘要:1. python函数运行原理 import inspect frame = None def foo(): bar() def bar(): global frame frame = inspect.currentframe() pass # python解释器 python.exe 会用一个叫做
阅读全文
生成器的简单使用
摘要:# 生成器函数 函数里面只要有yield关键字,就是一个生成器函数 # 生成器对象也是实现了迭代器协议了的 def gen_func(): yield 1 yield 2 yield 3 def func(): return 1 # 斐波拉契函数 a1 + a2 = a3 # 0,1,1,2,3,5
阅读全文
迭代器与可迭代对象
摘要:可迭代对象: 实现了__iter__协议的对象就叫可迭代对象 迭代器 : 继承了Iterator的类或者说实现__iter__和__next__协议的对象就叫着迭代器 二者的关系: 使用迭代器去遍历可迭代对象 (理解起来跟java一样的) 下面是个示例 from collections.abc im
阅读全文
metaclass简单使用
摘要:metaclass : 元类, 就是创建python类对象的类 # 便用type动态创建类 # 1. 使用type创建一个User类对象 无基类,无属性 . () : 表示基类, {}:属性 User = type('User', (), {}) user = User() print(user)
阅读全文
__new__与__init__的区别
摘要:__new__ : 控制对象的实例化过程 , 在__init__方法之前调用 __init__ : 对象实例化对象进行属性设置 class User: def __new__(cls, *args, **kwargs): """控制对象的创建的过程,在__init__方法之前调用""" print(
阅读全文
__getattr__属性查找
摘要:from datetime import date """ __getattr__ : 在查找不到对象的属性时调用 __getattribute__ : 在查找属性之前调用(一般都不要覆写) 所以,访问的属性的调用顺序是: __getattribute__ > 对象属性 > __getattr__
阅读全文
@property属性装饰器
摘要:顾名思义,@property就是一个跟属性相关的装饰器, 使用了它之后,取值和赋值操作都变得简洁 from datetime import date, datetime class User: def __init__(self, name, birthday): self.name = name
阅读全文
python编程中的一个经典错误之list引用
摘要:请看下面代码 class User: def __init__(self, name, hobby=[]): self.name = name self.hobby = hobby def add_hobby(self, hobby): self.hobby.append(hobby) def re
阅读全文
ChainMap简单示例
摘要:ChainMap是dict的子类,拥有dict的所有功能, 感觉用它的地方吧??? from collections import ChainMap """ 相当于join两个dict的操作 """ # 示例1 dict1 = {"a": 1, "b": 2} dict2 = {"c": 3, "d
阅读全文
Counter的数据统计功能
摘要:Counter是dict的子类,一般用于统计,默认排序是从大到小 from collections import Counter # 输入iterable对象即可 str_counter = Counter('dgwjgdsjgdjksgdsjgdgshfdsghfd') # 直接统计出结果,吊了一
阅读全文
deque的简单使用
摘要:deque 是python提供的一个数据结构,线程安全,功能比list强大 from collections import deque user_list = ['admin', 'root'] user = user_list.pop() # 弹出list尾部的元素, list没有提供操作头部的方
阅读全文
dict以及defaultdict的简单使用
摘要:先看一个需求 from collections import defaultdict """ 需求: 统计user_list中字母出现的次数 """ user_dict = {} user_list = ['A', 'B', 'C', 'A', 'C', 'C'] # 第一种方式 for item
阅读全文
namedtuple的简单使用
摘要:""" factory function for creating tuple subclasses with named fields namedtuple 是tuple的子类, 在tuple的基础上增添了许多功能, 最主要是可以把它看成一个类来使用 """ from collections im
阅读全文
python中*args和**kwargs学习
摘要:*args 和 **kwargs 经常看到,但是一脸懵逼 ,今天终于有收获了 """ python 函数的入参经常能看到这样一种情况 *args 或者是 **kwargs 但是它们到底是啥意思呢? 代码能说明一切 """ def hello(*args, **kwargs): print(args)
阅读全文
tuple拆包操作
摘要:""" tuple 是不可变对象 """ user_tuple = ('admin', 18, "cd", "male") print(user_tuple) # tuple 拆包 name, age, address, gender = user_tuple print(name, age, ad
阅读全文
dict常用操作
摘要:dict是python中的常用数据结构,应该尽量掌握其使用方法 """ 初始化一个dict的四种方式: 1. dict() -> 创建一个空的dict 2. dict(mapping) -> new dictionary initialized from a mapping object's (ke
阅读全文
Callable使用示例
摘要:之前工作中也有使用过Callable,但是却没有使用Thread对象去操作过,今晚 小组培训,涨知识了,现特意记录一下,以免忘记. 先看一下Thread的构造器 可以看到,Thread类并没有提供参数是Callable的构造器, 但是Runnable是有的. 再看下面类关系图 所以,我们在使用Thr
阅读全文
list列表切片方法汇总
摘要:python为list列表提供了强大的切片功能,下面是一些常见功能的汇总 """ 使用模式: [start:end:step] 其中start表示切片开始的位置,默认是0 end表示切片截止的位置(不包含),默认是列表长度 step表示切片的步长,默认是1 当start是0时,可以省略;当end是列
阅读全文
list操作
摘要:In [7]: a= [1,2] #定义一个list In [8]: a+[3,4] # 使用+操作 Out[8]: [1, 2, 3, 4] In [9]: a Out[9]: [1, 2] In [10]: a.extend([3,4]) # 使用extend操作,其实是在修改a In [11]
阅读全文
with上下文管理协议
摘要:with open('data.txt', 'r') as f: lines = f.readlines() for line in lines: print(line.split()) 类上面这段代码在python中很常见,就是使用with去管理资源。 其原理就是使用__entry__ 和__ex
阅读全文
re正则常用示例积累
摘要:2019-12-7 import re ''' 示例1: 提取网站的网址 ''' urls = ['https://blog.csdn.net/xxcupid/article/details/51993235', 'https://mbd.baidu.com/newspage/data/landin
阅读全文
python线程池示例
摘要:使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源 import threading, time from concurrent.futures import ThreadPoolExecutor, as_completed class MyTask(th
阅读全文
正则表达式之贪婪模式
摘要:首先需要明确一点,正则默认就是贪婪模式,何为贪婪模式? 就是在满足条件的前提下,尽可能多的进行匹配。 下面先来个例子 s ='my tel number is 132-4567-1258' r = re.match(r'(.+)(\d+-\d+-\d+)',s) print(r.groups())
阅读全文
re模块的高级使用
摘要:主要有四个方法: search : 从字符串的任意位置开始检索,首次匹配即结束 findall : 全部匹配 sub : 将正则匹配结果进行替换 split : 根据正则匹配结果将字符串进行切分,然后返回一个列表 import re ''' search 从字符串的任意位置搜索匹配,检索到第一个匹配
阅读全文
正则表达式常用示例
摘要:import re """ 使用match方法进行匹配 result = re.match(正则表达式,要匹配的字符串) 如果match匹配到数据的话,就可以使用group方法提取数据 注: 若字符串匹配正则表达式,则match方法返回匹配对象(Match Object), 否则返回None(不是空
阅读全文
ThreadLocal源码分析
摘要:1.测试代码 public class ThreadLocalTest { public static void main(String[] args) { ThreadLocal<String> threadLocal = new ThreadLocal<>(); threadLocal.set(
阅读全文
python类对象属性查找原理
摘要:class Foo(object): def __init__(self): # 这是一个对象属性 self.obj_pro = 12 # 这是一类属性 c_pro = 11 # 这是一个静态方法 @classmethod def c_method(self): print('c_method')
阅读全文
netty模型简介
摘要:Netty工作原理图 netty抽象出了两组线程池,BossGroup专门负责客户端 的连接,WorkerGroup专门负责网络读写。 BossGroup和WorkerGroup 类型都是NioEventLoopGroup NioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件
阅读全文
Reactor模式
摘要:Reactor有三种模式: 单reactor单线程 单 reactor多线程 主从reactor 1. 单reactor单线程工作原理图 dispatch与handler在同一个线程中处理。。。 redis就是采用这种模式 2. 单reactor多线程工作原理图 (1) reactor对象通过sel
阅读全文