Python代码性能优化

来源:互联网 发布:其他设备网络控制器 编辑:程序博客网 时间:2024/05/24 06:09

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

Python使用非常方便、灵活,因此很受欢迎。但正因为如此,导致实现同一功能时,Python代码有很多写法,但不同的写法有不同的性能。因此写Python代码要有良好的习惯,多写高性能的代码。作者原来平常写Python代码也很随意,直到某天处理大量数据时半天看不到结果,究其原因,是Python代码的性能问题导致的。

1. 列表解析与列表重建

#!/usr/bin/env python# _*_ coding: utf-8 _*_import timefr = open('words.txt')t1 = time.time()word_list = fr.readlines()t2 = time.time()print 'read file time: ', t2 -t1fr.close()# for循环构建列表keywords = []t1 = time.time()for word in word_list:    word = word.strip()    keywords.append(word)t2 = time.time()print 'for loop time: ', t2 - t1# 列表解析t3 = time.time()keywords = [word.strip() for word in word_list]t4 = time.time()print 'list pars time: ', t4 - t3fr = open('words.txt')t5 = time.time()keywords = [word.strip() for word in fr.readlines()]t6 = time.time()fr.close()print 'read file and list parse time: ', t6 - t5print 'list length: ', len(word_list)

运行结果:

read file time:  0.0318450927734for loop time:  0.137716054916list pars time:  0.0910630226135read file and list parse time:  0.124923944473list length:  441669

结论:本次测试中,列表解析时间是for循环时间的2/3

2. 字符串拼接

#!/usr/bin/env python# _*_ coding: utf-8 _*_import timefr = open('words.txt')keywords = [word.strip() for word in fr.readlines()]fr.close()# 加号拼接字符串t1 = time.time()str1 = ''for word in keywords:    str1 += wordt2 = time.time()print 'string concat time: ', t2 - t1# join拼接字符串t1 = time.time()str2 = ''.join(keywords)t2 = time.time()print 'string join time: ', t2 - t1print 'list length: ', len(keywords)

运行结果:

string concat time:  0.0814869403839string join time:  0.0123951435089list length:  441669

结论:本次测试中,join函数拼接字符串比+=拼接字符串快6倍多

3. range与xrange

  • range

python中range会直接生成一个list对象。

  • xrange

用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器,它的类型为xrange。在生成非常大的数字序列时,xrange不会马上开辟很大的一块内存空间。如果不是需要返回列表,则尽可能使用xrange

测试代码:

#!/usr/bin/env python# _*_ coding: utf-8 _*_import timet1 = time.time()for i in range(1000000):    passt2 = time.time()print 'range time: ', t2 -t1t1 = time.time()for i in xrange(1000000):    passt2 = time.time()print 'xrange time: ', t2 -t1

测试结果:

range time:  0.0680990219116xrange time:  0.0329170227051

结论:本次测试中,xrangerange快一倍多。