python语法优化
一. 字符串拼接
1 document = "%s%s%s%s" % (title, introduction, main_piece, conclusion) 2 document = "%(title)s%(introduction)s%(main_piece)s%(conclusion)s" % locals 更好 3 full_doc = "".join(world_list)
二. 函数返回值缓存和函数查询表
1 把函数、输入参数和返 回值全部都保存起来,在函数下次被调用时直接使用存储的结果(不需 要重新计算所有数据) 2 把输入参数放入字典,作为不重复的键,可以在字典 中保存函数结果,也可以在函数结果已经被保存之后通过字典的键查询 直接获取。 3 代价: 拿内存空间换运行时间 4 这种优化方法的典型使用情形是在处理固定参数的函数被重复调用时。 这样做可以确保每次函数被调用时,直接返回缓存结果。如果函数被调 用很多次,但是参数是随机变化的,那么我们存储函数就没什么效果 了。
三. 使用默认参数
四. 列表综合表达式与生成器
1 # 用列表综合表达式产生0-100内的50个偶数 2 multiples_of_two = [x for x in range(100) if x % 2 == 0] 3 # 通过for循环产生同样的结果 4 multiples_of_two = [] 5 for x in range(100): 6 if x % 2 == 0: 7 multiples_of_two.append(x) 8 列表推导式更加高效
1 生成器对象和列表对象的主要差异是,生成器对象不支持随机接入 (random access)。所以你不能再用方括号直接标记表达式。但是你可 以通过for循环遍历生成器对象获得列表 2 my_list = (x**2 for x in range(100)) 3 # 你不能这么写 4 print my_list[1] 5 # 但是可以这么写 6 for number in my_list: 7 print number 8 9 列表对象和生成器对象的另一个关键差异是,生成器对象只能遍历一 次,而列表对象可以遍历任意次。 10 11 生成器表达式在创建规模较大的列表时更有优势,而 创建规模较短的列表时,列表综合表达式更有优势。
五. ctypes模块, 调用c语言
六. 其他
1 不要重复造轮子, 尽量使用标准库核心组件, 使用内置函数 2 3 成员关系测试:a in b, 使用字典和集合, 比列表和元组有更好的性能 4 5 需要一个固定长度的数组或可变长度的栈 (stack)时,列表非常适合。 6 7 有时不定义函数更好:调用函数会增加大量的资源消耗(我们之前 已经看见过)。因此,有时候,尤其是在时间密集的循环体中内联 函数代码,不调用外部函数,可以更加高效。这个窍门有一个很大 的代价,因为它可能会损害代码的可读性和维护便利性。因此,仅 当必须提升性能时才应这样做。 8 9 尽可能用key函数排序:在对列表进行自定义规则的排序时,不要 用比较函数排序,而是应该尽可能地用key函数排序。这是因为每 个元素只需要调用一次key函数,而在运行过程中每一项都要调用 比较函数好几次。 10 11 1比True好 12 13 多元赋值(multiple assignments)很慢但是……:多元赋值(a,b = "hellothere", 123)通常比单独赋值要慢。但是,在进行变 量交换时,它比普通方法要快(因为我们不需要使用临时变量和赋 值过程) 14 15 推荐使用链式比较:在比较三个变量时,不要用 x<y 和 y<z,可以 用 x<y<z。这样更容易阅读(更自然)且运行更快