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')

 

 
 
 

posted on 2020-08-09 23:40  chenboshi  阅读(158)  评论(0编辑  收藏  举报

导航