一、数据结构与算法
1、算法性能评估
时间复杂度、空间复杂度
2、数据结构
数组与列表
队列
堆栈
链表
二叉树
多叉树
递归算法
二、设计模式
1、单例
(1)GIL:线程互斥锁。保证同一时刻只有一个线程在进行。
(2)多进程与多线程
1)计算密集型
假如一个计算密集型的任务需要10s的执行时间,总共有4个这样的任务,求运行总时长。
在 4核及以上的情况下:
多进程:4个CPU开启4个进程,进程并行,执行时间10s多。
多线程:1个CPU(进程)同时开启4个线程,开启线程消耗的资源很少,但实际运行CPU只有1个,所有执行时间40s多。
计算密集型考虑多进程,多个CPU同时跑,比如计算圆周率。
2)IO密集型
IO密集型,IO操作需要花费很长的时间(或者网络请求time.sleep(),多个CPU并不能提效,反而进程切换也需要花费时间)远大于CPU。此时,多个CPU跑反而时间更长。
2、工厂模式
3、其他设计模式
(1)代理模式定义
为其他对象提供一种代理以控制整个对象的访问
(2)代理模式uml图
Subject类:函数的定义
Proxy代理类:函数的调用
RealSubject类:函数的具体实现
例:
代理伪代码:
class Proxy(GiveGift):
Proxy(SchoolGirl mm):
gg = new Pursuit(mm)}
GiveLipstick():
gg.GiveLipstick()
客户端调用伪代码:
SchoolGirl jiaojiao = new SchoolGirl()
jiaojiao.name = "李娇娇"
Proxy xiaohong = new Proxy(jiaojiao)
xiaohong.GiveLipstick()
xiaohong.GiveBracelet()
xiaohong.GivenNecklace()
(2)代理模式的应用
1)远程代理:最经典的是web service。想在本地访问另一台主机的代码,实现方式:在本地开启代理,通过web service发送远程请求,再拿到这个请求供本地调用。在本地调用代理代码,就根本不会知道调用的是远程web应用。可以隐藏这些细节。
2)虚拟代理:存放实例化需要很久的对象,比如网页先看到文字,后看到图片,很多浏览器都是用的这种方式
3)安全代理:控制真实对象的访问权限
4)智能指引:调用真实对象时,处理另外一些事,比如计算知识对象的引用次数。