Python高性能技巧

数据结构使用技巧

列表

在列表中检查是否存在某个值远比字典和集合速度慢,因为Python是线性搜索列表中的值,但在字典和集合中,在同样的时间内还可以检查其它项(基于哈希表)。

append vs insert

与append相比,insert耗费的计算量大,因为对后续元素的引用必须在内部迁移,以便为新元素提供空间。
如果要在序列的头部和尾部插入元素,你可能需要使用collections.deque,一个双尾部队列。

串联和组合

通过加法将列表串联的计算量较大,因为要新建一个列表,并且要复制对象。用extend追加元素,尤其是到一个大列表中,更为可取。

bisect

如果列表项很多,且需要保持排序,更高效.
bisect模块支持二分查找,和向已排序的列表插入值。

前提: 列表已排序.即对未排序的列表使用bisect不会产生错误,但结果不一定正确.

性能小贴士

  • 把重复操作作为参数放到循环进行是非常低效的。应该提取成一个新变量。
  • 字符串连接符+比较低效,应该用格式化操作符%,或把字符串放到列表然后join()

工具