视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Pythonwhile、for、生成器、列表推导等语句的执行效率测试
2020-11-27 14:41:10 责编:小采
文档

一个功能的实现,可以用多种语句来实现,比如说:while语句、for语句、生成器、列表推导、内置函数等实现,然而他们的效率并不一样。写了一个小程序来测试它们执行的效率。

测试内容:
将一个数字大小为20万的数字,依次取绝对值,放到列表中,测试重复1千次.
测试程序:

代码如下:


import time,sys
reps = 1000 #测试重复次数
nums = 200000 #测试时数字大小


def tester(func,*args): #总体测试函数
startTime = time.time()
for i in range(reps):
func(*args)
elapsed = time.time() - startTime #用time模块来测试,结束时间与开始时间差
return elapsed

def while_Statement(): #while循环实现
res = []
x = 0
while nums > x:
x += 1
res.append(abs(x))

def for_Statement(): #for循环实现
res = []
for x in range(nums):
res.append(abs(x))

def generator_Expression():#生成器实现
res = list(abs(x) for x in range(nums))

def list_Comprehension(): #列表解析实现
res = [abs(x) for x in range(nums)]


def map_Function(): #内置函数map实现
res = map(abs, range(nums))


print sys.version #打印系统版本
tests = [while_Statement, for_Statement, generator_Expression, list_Comprehension, map_Function]
for testfunc in tests: #将待测函数放置列表中依次遍历
print testfunc.__name__.ljust(20),': ',tester(testfunc) #

测试结果:

代码如下:


>>>
2.7.4 (default, Apr 6 2013, 19:55:15) [MSC v.1500 bit (AMD)]
while_Statement : 84.5769999027
for_Statement : 75.2709999084
generator_Expression : 62.3519999981
list_Comprehension : 60.4090001583
map_Function : 47.5629999638


改写程序:

代码如下:


import sys
nums = 100

def while_Statement():
res = []
x = 0
while nums > x:
x += 1
res.append(abs(x))

def for_Statement():
res = []
for x in range(nums):
res.append(abs(x))

def generator_Expression():
res = list(abs(x) for x in range(nums))

def list_Comprehension():
res = [abs(x) for x in range(nums)]


def map_Function():
res = map(abs, range(nums))

if __name__=='__main__':
import timeit #用timeit模块来测试
print sys.version
funcs = [while_Statement, for_Statement, generator_Expression, list_Comprehension, map_Function]
for func in funcs:
print func.__name__.ljust(20),': ',timeit.timeit("func()", setup="from __main__ import func")

测试结果:

代码如下:


>>>
2.7.4 (default, Apr 6 2013, 19:55:15) [MSC v.1500 bit (AMD)]
while_Statement : 37.1800067428
for_Statement : 30.3999109329
generator_Expression : 27.25978641
list_Comprehension : 17.386223449
map_Function : 12.73868663


测试分析:

用time模块,和timeit模块两种测试方式测试了很多组数字,得出的结果是执行内置函数最快,其次就是列表推导,再其次生成器和for循环,while循环最慢。一般最快的使用内置函数的方法要比使用最慢的while快两倍以上。简单分析下原因:内置函数比如说map,filter,reduce(在Python3.0中移除)基本上都是用C语言来实现的,所以速度是最快的,列表推导内的迭代在解释器内是以C语言的速度运行的(一般是for循环的两倍,对大型文件操作而言,用列表推导效果尤其明显),相比较for循环代码是在PVM步进运行要快的多。但for循环里面含range(),相对速度也会快些,while语句是纯粹用Python代码写成,所以速度最慢。所以函数式编程最好使用内置函数,然后才考虑使用列表推导或for循环。最好不用while循环.

下载本文
显示全文
专题