用内置函数,别手写循环Python的C实现内置函数,比纯Python循环快几十倍。sum、map、filter、any、all,能用就用。你写for累加,人家一行sum搞定。别用Python的语法,干C的活。内置函数是别人替你优化过的轮子,何必重新造。
列表推导式,不是装饰品[x2 for x in data]比for循环加append快。因为推导式在C层面执行,减少解释器开销。但别嵌套三层,可读性比微秒重要。推导式是加速器,不是炫技场。
局部变量,比全局快函数内访问局部变量,比全局变量快。把len、range赋给局部名,循环里反复用。globals()查找慢,局部作用域是快车道。把常用函数请进家门,别每次都去远方取。
用生成器,省内存也省时间处理大文件,别readlines全读进内存。用生成器逐行处理,内存降下来,启动快起来。yield是延迟的智慧。生成器不是省内存,是省命。
字符串拼接,用join别用++每次创建新字符串,join一次分配。循环里+是平方复杂度,join是线性。拼接字符串,join是正道,+是歧途。
选择正确的数据结构查字典用dict,别用列表in。去重用set,别用列表循环。collections里的deque、Counter、defaultdict,都是为性能生的。数据结构选错,算法再牛也白搭。
用C扩展或Cython热点代码用numpy、pandas,底层是C。或写Cython,静态类型编译。Python慢在解释,快在借力。别硬扛,借C的腿跑。
避免不必要的属性访问obj.attr比局部变量慢。循环里把obj.attr赋给局部。self.method()每次查找,缓存起来。属性访问是隐形税,积少成多。
用f-string,别用%或formatf-string在编译期求值,最快。%和format运行时解析。字符串格式化,f-string是亲儿子。
Profile,别猜cProfile、line_profiler,找出真正瓶颈。别凭感觉优化,优化了不痛的地方,等于没优化。没有profiling的优化,是蒙眼射箭。
十个技巧,不是每条都翻天覆地。但合起来,快十倍不是梦。性能优化不是一次冲刺,是日常习惯。你写代码时多想一秒,运行时少等十分。Python可以很快,只要你懂它慢在哪。现在就去改一行,你的程序会感谢你。