大话性能 Python 多种循环方式的执行效率对比实验

大话性能 · 2023年05月25日 · 3065 次阅读

可能是自己做性能测试这块的缘故,平时在写脚本或者代码的时候,脑子中总是会想我这样写出来的效率高吗?总想用更高效的方法去实现同一个功能?可能互联网人多多少少有一点点的强迫症吧,今天就和大家分享实践下几种 python 不同的执行效率的写法,作为有追求的技术人员,不能仅仅局限于完成功能,更多内容可以学习《测试工程师 Python 工具开发实战》书籍。

一、效率对比

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

二、代码内容

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

演示 Python 的对比代码
# encoding: utf-8

"""
@python: v3.5.4
@author: hutong
@file: comparePerf.py
@time: 2019/3/17 下午12:16
"""

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



if __name__ == "__main__":

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

测试结果是发现利用 python 的列表推导比常见的 for 循环,while 循环要快很多。分析了下原因:列表推导内的迭代在解释器内是以 C 语言的速度运行的 (一般是 for 循环的两倍,对大型文件操作而言,用列表推导效果尤其明显), while 语句是纯粹用 Python 代码写成,所以速度最慢。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册