`
jeffreydan
  • 浏览: 27137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python异常处理对性能影响怎么样?

阅读更多

一、糟糕的代码

在使用python编程语言处理查找列表或字典中的某个数据项时,我经常看到这样的代码(省略具体逻辑):

场景一:
try:
    data_list = find("condition")[0]
except:
    pass

场景二:
try:
    dict_list = find("condition")["key"]
except:
    pass

 以上这些代码虽然能够满足程序的功能,但这都不是最佳的实现方式,原因如下:
1、try捕获异常会造成异常(软中断),会影响性能。
2、作为靠谱的程序员,应该采取防御性的方式编码,而不应该将错误的处理都丢给系统。

二、糟糕的代码执行时间上的PK

基于上述原因,我与编码者(上述代码作者)交流过,其中的回答“python对异常的处理方式非常好,从而几乎不影响性能,这也是推荐的一种处理方式”让我好奇,于是做了个小实验---python异常处理对性能的有多大的影响?源代码如下:

#! /bin/usr/env python
# -*- coding:utf-8 -*-

import time

#统计方法执行的时间
def count_time(func):
    def wrap(*args):
        start = time.time()
        func(*args)
        end = time.time()
        print "func:%s  time:(%0.3f ms)" % (func.func_name, (end-start) * 1000)
    return wrap

#key不存在的时候
@count_time
def not_exists_use_try(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        try:
            dict_list["not_exists"]
        except:
            pass

#key存在的时候
@count_time
def exists_use_try(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        try:
            dict_list["do_something"]
        except:
            pass

#key不存在的时候并使用Exception
@count_time
def not_exists_use_try_except(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        try:
            dict_list["not_exists"]
        except Exception, e:
            pass

#key存在的时候并使用Exception
@count_time
def exists_use_try_except(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        try:
            dict_list["do_something"]
        except Exception, e:
            pass

#使用防御性编码
@count_time
def not_use_try(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        if "not_exists" in dict_list :
            pass
        else:
            pass

def run(max):
    print "max:%s" % max
    not_exists_use_try(max)
    not_exists_use_try_except(max)
    exists_use_try(max)
    exists_use_try_except(max)
    not_use_try(max)

if __name__ == "__main__":
#100
    run(100)
#1,000
    run(1000)
#10,000
    run(10000)
#100,000
    run(100000)
#1,000,000
    run(1000000)
#10,000,000
    run(10000000)

 通过对上面的实验程序的3次运行,采样结果如下:

max:100
func:not_exists_use_try  time:(0.110 ms)
func:not_exists_use_try_except  time:(0.110 ms)
func:exists_use_try  time:(0.012 ms)
func:exists_use_try_except  time:(0.011 ms)
func:not_use_try  time:(0.009 ms)

max:1,000
func:not_exists_use_try  time:(0.941 ms)
func:not_exists_use_try_except  time:(1.058 ms)
func:exists_use_try  time:(0.091 ms)
func:exists_use_try_except  time:(0.091 ms)
func:not_use_try  time:(0.063 ms)

max:10,000
func:not_exists_use_try  time:(10.341 ms)
func:not_exists_use_try_except  time:(10.869 ms)
func:exists_use_try  time:(0.879 ms)
func:exists_use_try_except  time:(0.904 ms)
func:not_use_try  time:(0.616 ms)

max:100,000
func:not_exists_use_try  time:(95.245 ms)
func:not_exists_use_try_except  time:(109.051 ms)
func:exists_use_try  time:(9.277 ms)
func:exists_use_try_except  time:(9.290 ms)
func:not_use_try  time:(7.086 ms)

max:1,000,000
func:not_exists_use_try  time:(932.254 ms)
func:not_exists_use_try_except  time:(1088.768 ms)
func:exists_use_try  time:(110.238 ms)
func:exists_use_try_except  time:(104.085 ms)
func:not_use_try  time:(85.284 ms)

max:10,000,000
func:not_exists_use_try  time:(9292.667 ms)
func:not_exists_use_try_except  time:(10858.698 ms)
func:exists_use_try  time:(1037.037 ms)
func:exists_use_try_except  time:(1008.167 ms)
func:not_use_try  time:(812.829 ms)

 观察上面的采样结果得知:
一、程序执行时间随着执行的次数同比递增增长。
二、其中使用try...except,Exception的方式会比使用try...except的方式稍花时间,但这点时间可以忽略不计。
三、其中当使用try方式时发生异常比使用try方式时无异常花费时间约10倍。
四、使用防御性方式编码在这几种方式中最花费时间最少。

三、总结

以上数据会根据程序执行环境的不同而得出不同的采样结果,从上面的采样数据结果来看,执行次数在10,000,000级别时候才有明显的延时,抛开性能影 响的层面,作为靠谱的程序员,应该采取防御性的方式编码,而不应该将错误的处理都丢给系统,这样的好处明显就是性能的提升,同时也加强了程序的可读性。

分享到:
评论
1 楼 marlonyao 2011-01-19  
你的测试不公平,你应当至少还加上一种测试情况:
@count_time
def exists_not_use_try(max):
    dict_list = {"do_something":"...."}
    for item in range(0, max):
        if "do_something" in dict_list :
            dict_list["do_something"]
        else:
            pass

这里做了两次判断,在我的机器上,它比exists_use_try和exists_use_try_except都慢。

从性能上来说,如果key存在的情况是大多数情况,用try except可能速度更快。

其实速度根本相差无几,可读性才重要。在python中,另一种方法是使用get。我也同意你的观点,应当使用防御性编程,可能是因为我之前是写java的,在java中创建异常会同时创建stacktrace,这是很耗时的操作,在python中异常是不带stacktrace(在python中叫做traceback)的,所以创建异常的开销比java中小很多。

相关推荐

    python后处理详解:手把手教你用python读数据_python数据处理_python数据_Python数据处理_pytho

    在实践中,不断学习和理解Python的更多高级功能,如使用Pandas的性能优化技巧、使用Dask进行大规模数据处理,以及使用Jupyter Notebook或VSCode等开发环境提高工作效率,将使你在数据处理领域更加游刃有余。

    2021年python面试常见的问题.docx

    5. Python中的异常处理机制是什么? 二、面向对象编程 1. Python中的类和对象是什么? 2. Python中的继承和多态是什么? 3. Python中的组合和聚合是什么? 4. Python中的访问控制是什么?(public、private、...

    基于python的异常检测算法代码设计与实现

    2. 特征选择:确定哪些特征对异常检测最有用。 3. 参数调优:根据数据集调整模型参数以提高性能。 4. 模型评估:使用交叉验证和适当的评价指标(如AUC-ROC、精度、召回率等)评估模型效果。 5. 可视化:通过散点图、...

    Python-Databot高性能Python数据驱动的编程框架

    Python-Databot是一个专为高性能数据处理设计的Python框架,它特别适用于Web爬虫、ETL(提取、转换、加载)任务以及构建复杂的数据管道。这个框架充分利用了Python的灵活性和强大功能,同时优化了性能,使其在处理...

    Python数据处理课程设计-房屋价格预测

    - 异常值处理:异常值可能会影响模型的准确性,因此需要对其进行识别并采取适当的处理措施,如删除、替换或调整。 - 数据集合并:为了训练模型,通常需要将训练集和测试集合并,统一进行预处理,之后再分开。 - 删除...

    Python大数据处理库 PySpark实战

    此外,还将讨论Spark的转换和行动操作,以及如何优化数据分区和缓存策略,提高处理性能。 ### 第5章 Spark ETL 实战 ETL(提取、转换、加载)是大数据处理的关键环节。PySpark提供了一系列工具来实现高效的数据...

    Python数据处理与分析-葡萄酒评论分析课设

    在本课程设计中,我们将深入探讨使用Python进行数据处理与分析的应用,具体案例为对葡萄酒评论的分析。Python作为一门强大的编程语言,尤其在数据科学领域有着广泛的应用,其丰富的库资源如Pandas、Numpy和...

    Python面试题 最常见的36道Python面试题你能答对多少?附带答案 共27页.pdf

    Python使用`try/except`语句进行异常处理,允许在发生错误时捕获并处理异常,避免程序崩溃。 这只是Python面试题的一部分,实际面试中可能还会涉及更多主题,如模块化、装饰器、生成器、面向切面编程、网络编程、...

    使用Python快速开发Linux性能采集代理.zip

    9. **异常处理**:为了使程序更具健壮性,我们需要学会如何使用Python的异常处理机制,如`try/except`块,来捕获并处理可能出现的错误。 10. **接口设计与测试**:性能采集代理可能需要对外提供API,让其他应用能够...

    对于上亿数据使用python进行分块处理

    3. **异常处理**:在实际应用中,还需要考虑可能出现的各种异常情况,如文件读取错误、数据格式问题等,并做好相应的错误处理机制。 4. **数据完整性**:确保数据处理过程中不会丢失或修改原始数据的完整性是非常...

    Python-WallarooPython原生高性能数据处理平台类似SparkStorm

    Wallaroo,作为一款Python原生的高性能数据处理平台,被广泛赞誉为与Spark和Storm相媲美的工具。这个强大的框架专为实时、大规模数据流处理而设计,提供了高度可扩展性和低延迟的解决方案。在Python开发领域,...

    浅谈Python大数据对财务分析的影响.zip

    3. 系统性能:大数据处理可能对硬件资源提出较高要求,合理使用数据分区、并行计算等技术,可以有效提升处理效率。 综上所述,Python大数据分析为财务工作带来了革命性的变化,提高了效率,增强了洞察力,并为企业...

    Python-betterexceptions在Python中漂亮和实用的异常

    Python作为一个强大的编程语言,其异常处理机制是其核心特性之一。然而,标准的异常处理虽然功能强大,但在显示错误信息时可能不够直观和易读。这就是`better-exceptions`库的作用所在。`better-exceptions`是一个...

    python cuda gpu 高性能运算 代码

    Python CUDA GPU 高性能运算是一种利用图形处理器(GPU)的强大计算能力加速科学计算、数据分析以及机器学习等任务的技术。CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种并行计算平台和编程...

    Python-Pipelines是使用Python编写高性能管道脚本的框架和语言

    Python Pipelines是一个强大的框架,专为构建高性能的并行处理管道而设计。它结合了Python的易用性和灵活性,使得开发者能够高效地处理大规模数据流。在这个框架中,管道的结构与组件的实现是分离的,这使得代码的...

    Python+locust 性能测试教程

    理解Python的基本语法、数据结构(如列表、字典)、控制流(如循环和条件语句)以及异常处理是进行Locust测试的基础。 2. ** Locust介绍**:Locust是一种轻量级的性能测试框架,它允许开发者编写脚本来模拟用户行为...

    基于python的运用KernelPCA重构误差的异常检测算法设计与实现

    在本项目中,我们主要探讨的是如何利用Python编程语言实现基于KernelPCA(核主成分分析)的异常检测算法。KernelPCA是一种非线性降维技术,它通过将数据映射到高维空间,然后在该空间中进行主成分分析,以此来解决...

    Python-pydis用Python3克隆一个redis性能更佳优越

    1. **Python的并发编程**:为了提高性能,`pydis`可能使用了Python的异步I/O模型,如`asyncio`库,实现非阻塞的网络通信,允许在同一时间处理多个客户端连接。 2. **数据结构实现**:Redis以其高效的数据结构著称,...

Global site tag (gtag.js) - Google Analytics