环境:pyhton2.7
性能分析方法:运行时间较小为优
import time
init_time = time.clock()
func()
last_time = time.clock()
性能时间times值的大小
times = last_time - init_time()
一:字符串连接
在python里面,字符串是不可变的(immutable),就是说一旦你创建了一个字符串就不可以改变它的值。所以,当我们要做任何改变字符串内容的操作时,其实都是创建了一个带有新内容的新字符串,我们的变量会指向新的字符串。所以我们可以用列表list保存字符片段,结束后用 .join 连接列表。
例子:10000000个字符串相加
words = [str(x) for x in xrange(1000000)]
普通方法:
str = ""
for w in words:
str += w
改进方法:
str = "".join(words)
二:列表综合表达式和生成器和普通for循环
列表综合表达式是Python提供的特殊范式,以数学方式表达要生产的列表,重点是描述计算什么,而不是描述计算的过程(经典的for循环语句)
例子:产生0-100内的偶数
列表综合表达式:
a = [x for x in range(10000) if x % 2 == 0]
普通for循环:
a = []
for x in range(10000):
if x % 2 == 0:
a.append(x)
普通for循环和列表综合表达式比较:
①普通的for循环产生的指令集更多,比列综多1/4左右,所有一般情况下列综表达式速度更快,注意是一般!!
②普通的for循环会产生副作用,不要肆意把列综表达式代替所有普通for循环表达式
③重点!处理大列表(数量10000以上)的时候,列表综合表达式可能就不好使了。因为列表综合表达式需要直接产生每一个值,因此你可以考虑使用生成器表达式(generator expression)
生成器对表达(generator expression):
如果你不需要直接返回列表值(数据以列表保存),我们可以用生成器表达式来处理,而是返回一个生成器对象。
a = (x for x in range(10000) if x % 2 == 0)
因为不是返回列表,所以不可以这样操作
print a[1]
但是可以遍历操作:
for number in a:
print numver
总结:如果你不需要直接返回列表值(数据以列表保存),用生成器表达式来处理方式是最理想的。而你需要返回列表值时,那么需要考虑处理数据的量,量大就用普通for循环,数量较小就用列综表达式。
但是接入生成器的列表元素时可能会增加一定资源消耗,但是用塔创建列表的速度更快。列表综合表达式和生成器表达式创建不同长度的列表的时间如下:
最后例子:
import time
def func1():
init_time = time.clock()
a = []
for x in range(100000):
if x % 2 == 0:
a.append(x)
last_time = time.clock()
print last_time - init_time
def func2():
init_time = time.clock()
a = [x for x in range(100000) if x % 2 == 0]
last_time = time.clock()
print last_time - init_time
def func3():
init_time = time.clock()
my_list =(x for x in range(100000) if x % 2 == 0)
last_time = time.clock()
print last_time - init_time
func1()
func2()
func3()
输出:
三:使用默认参数
默认参数使用不普遍,这种方法是直接优化python解释器工作的方式
例子:计算三角函数
普通方法:
import math
def degree_sin(deg):
return math.sin(deg * math.pi / 180.0)
优化后:
import math
def degree_sin(deg, factor=math.pi/180.0, sin=math.sin):
return sin(deg * factor)
默认参数的方法优化时间能大概减少25%左右,显然不是一个十分出色的优化手段,但是能为我们减少几毫米的时间。但是还要牢记的是,如果你在一个操作系统的团队工作,使用这种方法是灾难性的。所以这种方法一般不建议使用。
四、不重复发明轮子
python的标准库核心组件大都是经过优化的C语言写的,因此不需要你自建,而且自建会更慢。
如:
①:数组(array),迭代工具(itertools),队列(collections.dequs)这些模块都是推荐使用的
②:需要一个固定长度的数组或可变长度的栈(stack)时,列表非常适合,但是在处理pop(0),insert(0,yout_list)操作时候,可以用(collections.deque),因为它在列表的任何一端都可以快速完成(0(1))插入和弹出操作
五:其他一些小细节
①while 1:比while True:好
②多元赋值代替中间变量赋值
③比较三个变量时候,使用链式比较,即0 < a < 10
④判断值k是否在字典里面就用 k in dict,就不用k in dict,keys(),可以讲是顺序查找和哈希查找的区别