python性能杀手-低效的性能结构
”在python中找到正确的数据是非常重要的,因为正确的选择不但会节省时间还能减少代码维护量“ ——《python高手之路》
理解python,使用正确的数据结构,以及尽可能重用标准库。
如何分析python代码的性能?
①timeit模块
import timeit timeit.timeit("x=sum(range(10))")
②cProfile模块
在命令行环境
python -m cProfile myscript.py 显示每个函数的调用次数,以及所花费的时间
python -s time cProfile myscript.py -s按照其他字段排序、
import cProfile cProfile.run(“sum( x**2 for x in range(100)”)
接下来看几个例子。
例子一,test2所花时间是test1的几百倍。
import cProfile count=10**5 def test1(): """append在列表尾部插入新数,最后reversed逆序""" nums=[] for i in range(count): nums.append(i) nums.reverse() def test2(): """每次在列表头部插入新数""" nums2=[] for i in range(count): nums2.insert(0,i) #打印出程序中各函数的计时结果 cProfile.run('test1()') cProfile.run('test2()')
例子2 字典
给找不到的键一个返回值,可以用dict 的get方法。如果要指定默认值,可以用setdefault。此外,collections模块还有deafultdict方法。
def add_animal_in_family(species,animal,family): #判断是否有family键,无则创建新键,键值为集合;再把animal参数添加到集合中 if family not in species: species[family]=set() species[family].add(animal) species={} add_animal_in_family(species,"tomcat","cat") print(species)
import collections def add_animal_in_family(species,animal,family): species[family].add(animal) #每次试图从字典中访问一个不存在的元素,deafultfict都会使用最为参数传入的这个函数 #去构造一个新值而不是抛出keyerror。 species=collections.defaultdict(set) add_animal_in_family(species,'cat','felidea')
作者:chenboshi
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。