百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

性能调优方面,经常要优化跑的最慢的代码,教你一种快速的方法

toyiye 2024-05-25 20:12 25 浏览 0 评论

在我们遇到性能问题的时候,很多时候需要去查看性能的瓶颈在哪里,本篇文章就是提供了多种常用的方案来监控函数的运行时间。

1.time

首先说明,time模块很多是系统相关的,在不同的OS中可能会有一些精度差异,如果需要高精度的时间测量,可以使用time.perf_counter。perf_counter仍然还是 基于时钟时间,很多因素会影响到它的精确度,比如机器负载。如果你对于执行时间更感兴趣,使用 time.process_time() 来代替它。 更多内容可以参考尾部的链接。

下面两个例子来源于《python cookbook》

装饰器模式1

import time
from functools import wraps


def timethis(func):
    '''
    Decorator that reports the execution time.
    '''
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(func.__name__, end-start)
        return result
    return wrapper

@timethis
def countdown(n):
    """
    Counts down
    """
    while n > 0:
        n -= 1
countdown(100000)

装饰器模式2,上下文管理器

import time
from contextlib import contextmanager

@contextmanager
def timethis(label):
    start = time.perf_counter()
    try:
        yield
    finally:
        end = time.perf_counter()
        print('{}: {}'.format(label, end - start))

# Example use
with timethis('counting'):
    n = 10000000
    while n > 0:
        n -= 1

2.timeit

python提供了timeit模块,这个可以在python console中直接使用

$ python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"

输出为:

4 loops, best of 5: 2.08 sec per loop

timeit在notebook中的使用

这个模块在ipython中使用起来相对简洁很多。

  • %timeit, 这种方式可以测量单行代码。
  • %%timeit, 这种方式可以测量整个cell的代码。

3.cprofile

上面的方法其实还是比较简单粗暴。profile模块是个更好的cProfile是profile的C实现,速度会更快。类似的包有pickle,也有个对应的Cpickle版本。 这个包可嵌入的代码中,类似下面这种:

import cProfile
cProfile.run("myfunction()")

我个人最喜欢的还是下面这种(下面的代码可能需要加一下PYTHONPATH):

$python -m cProfile -o output.pkl my_main_file.py

首先无需更改现有代码结构,其次可以将结果保存到output.pkl中。强烈建议将profile的结果保存起来,因为生产中有些profile可能耗时很长,而且控制台输出的内容有限,当你想从结果里面提取点重要信息,又要重新来过,特别耗时。

当获取上面的output.pkl的时候,可以进入python console,使用pstats得到结果:

import pstats
p = pstats.Stats('output.pkl')  # 文件名
p.sort_stats('time')  # 按照时间排序
p.print_stats(10)  # 最耗时的前10个,如果没有参数,默认输出全部
  • ncalls: 函数被call的次数
  • tottime:函数总的耗时,但是不包括其子函数的耗时
  • percall:tottime平均到每次调用的耗时
  • cumtime:函数总的耗时,包括了其子函数的耗时(- 递归函数也不例外)
  • percall:cumtime平均到每次调用的耗时
  • filename:lineno(function) :每个函数各自的信息

4.line_profiler

看每一行执行的时间占比,也大概知道原因出在什么地方了。自带的profile会深入到包的底层运算逻辑,不是特别清晰。下面是line_profiler的使用方法,个人感觉比装饰器的方式好用太多:

from line_profiler import LineProfiler
import random

def do_stuff(numbers):
    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler() 
lp_wrapper = lp(do_stuff) # 函数
lp_wrapper(numbers)  # 参数
lp.print_stats()

line_profiler在notebook中使用

line_profiler在notebook的使用也超级方便,非常推荐。

%load_ext line_profiler

class A:
    def to_profile_func():
        pass


%lprun -f A.to_profile_func A.to_profile_func()

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码