比较杂,想到什么写什么
基于python3.6
上下文管理器
class PypixContextManagerDemo:
def __enter__(self):
print("Entering the block")
def __exit__(self, *unused):
print("Exiting the block")
with PypixContextManagerDemo():
print("In the block")
自己实现很很简单,主要重写__enter__ 和 __exit__两个方法,定义好进去的时候干啥,退出的时候干啥就行
__slots__
限制class动态绑定的属性,如__slots__=('name', 'age'),则这个class只能动态绑定name和age这两属性,其他属性都不能绑定,试图绑定的话,会报 AttributeError 的一个错误。
但有一点要注意,这个属性仅对当前的类有点,对继承的子类是无效的,除非在子类中也定义了__slots__,这样子类允许的属性就是自身的__slots__和父类的__slots__
python性能优化的几个地方
套用网上的结果,在算法的时间复杂度排序上依次是:
O(1) -> O(lg n) -> O(n lg n) -> O(n^2) -> O(n^3) -> O(n^k) -> O(k^n) -> O(n!)
- 在需要多数据成员进行频繁的查找或者访问的时候,请使用 dict 而不是 list,可以直接使用dict.fromkeys(list,True)把list转换成dict
- set的union,intersection,difference操作要比list的迭代要快。因此如果涉及到求list交集,并集或者差的问题可以转换为set来操作。
- 循环方面,原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层
- 充分利用 Lazy if-evaluation 的特性,如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。
- 字符串连接的使用尽量使用 join() 而不是 +
- 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'))
- 对字符进行格式化请使用%或者format,不要使用+,这样既能增加代码可读性也能增加执行效率
- 使用递推式构造列表(list comprehension)或递推式构造生成器(Generator Comprehension)来代替使用常规的for循环
- 待后续补充...