python一些优化方法

环境: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(),可以讲是顺序查找和哈希查找的区别

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值