-
常用数据结构
- list,列表,有重复有序,线程不安全
- set,集合,无重复无序
- dict,字典,无序
- orderedict,有序字典,key顺序是插入的顺序。来自collections模块
- tuple,元组,不可变对象,线程安全
- nametuple,快速定义类对象,来自collections模块
- dataclass,
- 主要使用 from dataclasses import dataclass
- nametuple高级版, 定义有默认值和可变属性的类
- 默认属性都是公开可访问,省略__init__操作
- 基于装饰器修饰类来实现
- 属性可以被继承
-
常用的几个概念
- 装饰器:decorator
- 迭代器生成器
- 深拷贝和浅拷贝
- 动态参数
*args,*kwargs - is和==
- 局部变量和全局变量
- 正则匹配
- 随机变量生成常用方法
- 打印格式化:保留小数
-
魔法函数
__init__
注意区分__init__.py文件和类里面的__init__函数 - __init__.py 1.__init__.py的在文件夹中,可以使文件夹变为一个python模块,python的每个模块对应的包中都有一个 __init__.py文件的存在 2.我们在导入一个模块时候(也叫包),实际上导入的是这个模块的__init__.py文件。 3._init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:from PackageName import *,这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块 和子包导入到当前作用域中来。比如: __all__ = ["Module1", "Module2", "subPackage1"] - __init__ 函数 1. 类的初始化函数,在下面和__new__做比较__new__
1. __new__方法用于创建对象并返回对象,当返回对象时会自动调用__init__方法进行初始化。 2. __new__方法是静态方法,而__init__是实例方法, 即__new__是object调研创建对象,然后对象再调用__init__初始化属性 3.利用__new__实现单例模式: class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance s1 = Singleton() s2 = Singleton() print(s1) print(s2)__name__
1. __name__是内置变量,用于表示当前模块的名字, 2. python模块既可以直接运行,也可以导入到其它模块运行。当直接运行时模块的__name__输出为main,其他为模块所在路径名 3. 如果不写if __name__ == '__main__'时,直接写函数调用,那么这个模块被其他模块导入时也会被执行一遍。只有写了后,运行该模块才执行该语句下面的函数, 4. 一种编码规范__str__和__repr__
1. 两个都是为了输出对象更友好,返回字符串显示 2. __repr__: 在交互环境和print输出都会调用 3. __str__: 只有在print时调用,在交互环境还是输出对象的内存地址形式 4. 最好是重写 __repr__, 因为__str__只是repr的重写,str没有还是会去调用repr__del__
1. 类似析构函数,与__init__构造函数对应 2. 如果没有显示调用程序执行完后会自动调用定义的del()函数 3. 显示调研,即del obj后会触发del()函数 4. 当一个对象有多个引用时,del obj不会调用del(),只会减少obj的引用,到引用数==0时,再del才会调用 5. 定义了__del_()的实例无法被Python的循环垃圾收集器收集,所以尽量不要自定义__del__()__eq____hash____call__
-
类 @property和@xxx.setter
@property 把方法当做属性设置来使用, 简化get和set定义,调研score()既可以set也可以get class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value@staticmethod
-
文件操作
-
内存管理机制
-
多进程与多线程、线程安全
- 多进程
- 一般多进程都会复制数据,小心爆内存
- 多进程处理共享数据
- 只读情况,共享内存数据用:python multiprocessing Value
- 读写情况:建议每个数据相互独立,并行写,然后map reduce
- 如果数据相互不独立,设定原子操作或者加锁,开销较大,效率第
- 多进程
-
代码优化
- 优化方法论
- cProfile找瓶颈,诊断代码函数调用时间,通过line_profiler可以诊断每一行执行时间
- 宏观上是否可以修改(实现逻辑,数据结构,代码结构,更换工具或者模型)
- 逐步优化,可以使用高效的数据结构,或者用更接近底层的语言cython(numpy)或C++
- openmp
- 分布式运行,利用ray框架实现python代码分布式运行
- docker启动程序并行执行
-
pycharm使用
- .py文件注释模板
- 远程调式设置:
- 设置env
- 设置mapping
- 远程运行没问题,本地pycharm运行找不到路径或者路径错误分析
-
项目的working directory设置正确
-
设置成绝对路径:
os.path.join(os.path.dirname(__file__), './upload/demo.xlsx') -
os接收相对路径作为参数时,都是看程序运行目录(os.getcwd())的路径,因此一般新建或者保存都在主程序中实现。
-
- 运行代码找不到module
- pycharm项目根目录设置成源码目录,即把项目下的路径加入程序搜索路径
- 将指定模块加入到 sys.path 中
- .py文件注释模板
-
设计模式
- 单例模式
- 工厂模式
- 装饰器模式