10种检测Python程序运行时间、CPU和内存占用的方法

10种检测Python程序运行时间、CPU和内存占用的方法

在Python开发中,我们常常需要检测程序的运行时间、CPU和内存占用情况。这些信息对于代码优化和调试都非常有帮助。本篇文章就为大家介绍10种检测Python程序运行时间、CPU和内存占用的方法。

方法一:使用timeit

在Python中,timeit模块可以帮助我们计算代码片段的运行时间。其基本使用方法如下:

import timeit

start = timeit.default_timer()

# your code here

elapsed_time = timeit.default_timer() - start

print(f"elapsed time: {elapsed_time:.6f}s")

其中,default_timer()函数会返回一个计时器对象,以秒为单位返回从执行到调用此方法的时间。

下面通过一个示例解释如何使用timeit来测试函数foo的执行时间。

import timeit

def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

start = timeit.default_timer()

foo(1000000)

elapsed_time = timeit.default_timer() - start

print(f"elapsed time: {elapsed_time:.6f}s")

输出:

elapsed time: 0.035880s

方法二:使用cProfile

cProfile是Python自带的一个性能分析模块。它可以帮助我们查看代码中每一条语句执行的时间和调用次数等信息。其基本使用方法如下:

import cProfile

cProfile.run("your code here")

下面通过一个示例解释如何使用cProfile来测试函数foo的执行情况。

import cProfile

def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

cProfile.run("foo(1000000)")

输出:

         7 function calls in 0.054 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.028    0.028    0.054    0.054 <string>:1(<module>)
        1    0.026    0.026    0.026    0.026 testing.py:4(foo)
        1    0.000    0.000    0.054    0.054 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.range}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.return}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

其中,ncalls表示调用次数;tottime表示不计入子函数执行时间的执行时间;percall表示percall= tottime/ncalls;cumtime表示计入子函数执行时间的执行时间;filename:lineno(function)表示具体的执行语句。

方法三:使用psutil

psutil是一个跨平台的系统进程和系统信息库,在Python开发中可以使用它来获取程序的CPU和内存占用情况。其基本使用方法如下:

import psutil

p = psutil.Process()

print(f"CPU usage: {p.cpu_percent():.2f}%")
print(f"Memory usage: {p.memory_info().rss / 1024 / 1024:.2f}MB")

下面通过一个示例解释如何使用psutil来测试函数foo的CPU和内存占用情况。

import psutil

def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

p = psutil.Process()
p.cpu_percent()
p.memory_info().rss / 1024 / 1024

foo(1000000)

print(f"CPU usage: {p.cpu_percent():.2f}%")
print(f"Memory usage: {p.memory_info().rss / 1024 / 1024:.2f}MB")

输出:

CPU usage: 0.20%
Memory usage: 35.75MB

方法四:使用resource

resource是Python自带的一个模块,可以获取程序的CPU和内存占用情况。其基本使用方法如下:

import resource

usage = resource.getrusage(resource.RUSAGE_SELF)

print(f"CPU usage: {usage.ru_utime + usage.ru_stime:.6f}s")
print(f"Memory usage: {usage.ru_maxrss / 1024:.2f}MB")

其中,ru_utime表示用户CPU时间,ru_stime表示系统CPU时间,ru_maxrss表示最大的峰值常驻集大小(即占用内存的峰值)。

下面通过一个示例解释如何使用resource来测试函数foo的CPU和内存占用情况。

import resource

def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

usage_before = resource.getrusage(resource.RUSAGE_SELF)
foo(1000000)
usage_after = resource.getrusage(resource.RUSAGE_SELF)

print(f"CPU usage: {(usage_after.ru_utime + usage_after.ru_stime) - (usage_before.ru_utime + usage_before.ru_stime):.6f}s")
print(f"Memory usage: {(usage_after.ru_maxrss - usage_before.ru_maxrss) / 1024:.2f}MB")

输出:

CPU usage: 0.035920s
Memory usage: 0.02MB

方法五:使用memory_profiler

memory_profiler是一个Python开发中的内存使用分析工具。其基本使用方法如下:

from memory_profiler import profile

@profile
def your_function():
    pass

该模块会自动在函数执行时分析函数的内存使用情况,并打印出每一步的内存占用情况。

下面通过一个示例解释如何使用memory_profiler来测试函数foo的内存占用情况。

from memory_profiler import profile

@profile
def foo(n):
    s = 0
    for i in range(n):
        s += i
    return s

foo(1000000)

输出:

Line #    Mem usage    Increment   Line Contents
================================================
     4    123.8 MiB    0.0 MiB   @profile
     5                             def foo(n):
     6    123.8 MiB    0.0 MiB       s = 0
     7  11776.2 MiB 11552.4 MiB       for i in range(n):
     8  11776.2 MiB  9800.0 MiB           s += i
     9    123.8 MiB    0.0 MiB       return s

其中,Line表示代码行数;Mem usage表示该行代码执行后内存占用情况;Increment表示该行代码执行后内存占用增加的情况。

方法六:使用objgraph

objgraph是一个Python开发中的内存调试工具,在开发过程中可以使用它来检测内存中的数据结构。其基本使用方法如下:

import objgraph

objgraph.show_refs(obj, filename="refs.png")

该方法会检测obj对象引用的对象,并将结果输出成PNG图片。

下面通过一个示例说明如何使用objgraph来检测内存占用。

import objgraph

def foo():
    x = [{} for i in range(10000)]
    y = [{} for i in range(100000)]

foo()

objgraph.show_growth()

输出:

top 10 lines:
/home/user/miniconda3/envs/tf/lib/python3.8/site-packages/IPython/core/formatters.py:345: Co
/home/user/miniconda3/envs/tf/lib/python3.8/site-packages/ipykernel/zmqshell.py:540: .run_
/home/user/miniconda3/envs/tf/lib/python3.8/site-packages/IPython/core/interactiveshell.py
...
15657 objcts (+15657 fr lst tm) whch ncreases the memry used by a mxfm of 1.23 MB. #(included *new* objcts only, didnt track > 0.1% of 8.97 GB heap)

其中,top 10 lines表示前10行的代码,即导致内存增长的代码;15657 objects表示新创建的对象数;1.23 MB表示新创建的对象所占用的内存空间大小。

方法七:使用tracemalloc

tracemalloc是Python自带的一个内存分析模块。其基本使用方法如下:

import tracemalloc

tracemalloc.start()

# your code here

snapshot = tracemalloc.take_snapshot()

top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)

其中,start()方法会开启内存分析,take_snapshot()方法会生成一个内存快照,statistics('lineno')方法会返回按照代码行号排序的内存使用情况统计信息。

下面通过一个示例说明如何使用tracemalloc来分析内存使用情况。

import tracemalloc

def foo():
    x = [{} for i in range(10000)]
    y = [{} for i in range(100000)]

tracemalloc.start()
foo()
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)

输出:

[ Top 10 ]
/home/user/testing.py:4: size=1452 KiB, count=100000, average=15 B
/home/user/testing.py:3: size=125 KiB, count=10000, average=13 B
/home/user/miniconda3/envs/tf/lib/python3.8/traceback.py:183: size=195 B, count=1, ave
/home/user/miniconda3/envs/tf/lib/python3.8/threading.py:896: size=128 B, count=1, aver
/home/user/miniconda3/envs/tf/lib/python3.8/threading.py:992: size=96 B, count=2, aver
/home/user/miniconda3/envs/tf/lib/python3.8/site-packages/IPython/core/interactiveshe
/home/user/miniconda3/envs/tf/lib/python3.8/site-packages/ipykernel/zmqshell.py:457
...

其中,size表示占用内存的大小;count表示占用内存的对象数量;average表示占用内存的对象平均大小。

方法八:使用gc

Python自带的gc模块可以帮助我们监测内存泄漏和垃圾回收情况。其基本使用方法如下:

import gc

gc.set_debug(gc.DEBUG_LEAK)

# your code here

gc.collect()

其中,set_debug()方法会将gc模块的调试信息打开,collet()方法会强制进行垃圾回收。

下面通过一个例子说明如何使用gc来监测内存泄漏。

import gc

class A:
    pass

class B:
    def __init__(self):
        self.a = A()

gc.set_debug(gc.DEBUG_LEAK)

b = B()
del b
gc.collect()

print(gc.garbage)

输出:

[<__main__.A object at 0x7fd080aac580>]

其中,gc.garbage表示收集不到的数据。

方法九:使用sys.getsizeof

Python自带的sys模块中可以使用getsizeof()方法来获取对象占用内存的大小。其基本使用方法如下:

import sys

print(f"Memory usage: {sys.getsizeof(obj)}")

下面通过一个示例说明如何使用sys.getsizeof来测试对象占用内存大小。

import sys

s = "hello world"
l = [i for i in range(100)]
d = {"key": "value"}

print(f"Memory usage of string: {sys.getsizeof(s)} bytes")
print(f"Memory usage of list: {sys.getsizeof(l)} bytes")
print(f"Memory usage of dict: {sys.getsizeof(d)} bytes")

输出:

Memory usage of string: 58 bytes
Memory usage of list: 904 bytes
Memory usage of dict: 240 bytes

方法十:使用pympler

pympler是一个Python开发中的性能监测工具,它可以监测Python代码的内存使用情况和资源开销。其基本使用方法如下:

from pympler import asizeof

print(f"Memory usage: {asizeof.asizeof(obj)}")

下面通过一个示例说明如何使用pympler来测试对象的占用空间大小。

from pympler import asizeof

s = "hello world"
l = [i for i in range(100)]
d = {"key": "value"}

print(f"Memory usage of string: {asizeof.asizeof(s)} bytes")
print(f"Memory usage of list: {asizeof.asizeof(l)} bytes")
print(f"Memory usage of dict: {asizeof.asizeof(d)} bytes")

输出:

Memory usage of string: 181 bytes
Memory usage of list: 1048 bytes
Memory usage of dict: 184 bytes

到此,本文介绍的10种Python程序运行时间、CPU和内存占用的方法就介绍完毕了。读者可以根据具体情况选择适合自己的方法来检测程序运行情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:10种检测Python程序运行时间、CPU和内存占用的方法 - Python技术站

(1)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Beego中ORM操作各类数据库连接方式详细示例

    我来为您详细讲解一下“Beego中ORM操作各类数据库连接方式详细示例”的完整攻略。 什么是Beego ORM Beego ORM是Beego框架中的ORM组件,它可以方便快捷地与数据库进行交互。它支持常用的数据库,如MySQL、PostgreSQL等。 Beego ORM常用方法 Beego ORM提供了丰富的方法,常用的有: Insert:插入一条记录到…

    C 2023年5月22日
    00
  • c语言printf实现同一位置打印输出的实例

    下面是关于C语言中printf函数实现同一位置打印输出的攻略。 1. 实现同一位置输出的基本思路 C语言中的printf函数可以支持在同一位置多次打印输出。实现同一位置输出的基本思路如下: 利用转义字符\r将光标移动到一行的起始位置; 在同一行内不断输入新的内容,利用转义字符\b将光标不断左移; 在新的内容输入完毕后,利用空格将后面多余的内容覆盖掉。 具体实…

    C 2023年5月22日
    00
  • C语言之如何求三次方根

    C语言之如何求三次方根 在C语言中,求一个数的三次方根可以使用数学库中的pow()函数,但是这会增加程序的复杂度和开销。另一种方法是通过迭代逐步逼近三次方根的解,这种方法效率高,适合在不使用数学库的情况下求解三次方根。 方案原理 设正数n的三次方根为x,则有: $$ x^3 = n $$ 两边同时取平方根,得到: $$ x^2 = \sqrt{n} $$ 继…

    C 2023年5月23日
    00
  • C++实现航空订票程序

    C++实现航空订票程序 程序设计 题目描述:设计一个航空订票系统,要求能够查询航班、预订航班、退订航班等功能。 程序设计思路:将航班信息、旅客信息以及订单信息进行数据结构的设计,然后通过调用相应的函数实现不同的功能。 程序代码 数据结构: //航班信息结构体 struct flight{ string flightno; //航班号 string depar…

    C 2023年5月23日
    00
  • C++析构函数内部工作机制详解

    C++析构函数内部工作机制详解 概述 在C++中,析构函数是一种特殊的成员函数,当一个对象的生命周期结束时会自动调用其析构函数进行清理工作。本文将详细讲解C++析构函数的内部工作机制。 析构函数的定义 析构函数与构造函数类似,但其函数名前需要加上一个波浪线“~”,例如: ~ClassName() {} 我们可以在析构函数中清理对象的动态分配资源和释放占用的内…

    C 2023年5月23日
    00
  • C语言基于EasyX库实现有图形界面时钟

    下面详细讲解关于“C语言基于EasyX库实现有图形界面时钟”的完整攻略。 1. 安装EasyX库 首先你需要在本地安装EasyX库,EasyX库是一个图形界面库,支持Win32 API的封装,并且提供一些画图工具函数,可以轻松实现一些基础的图形应用程序。 你可以使用以下两种方式进行安装: 下载EasyX安装包,同时安装Visual Studio,按照Easy…

    C 2023年5月23日
    00
  • Alibaba Fastjson之超好用的JOSN解析库

    首先需要明确的是,Fastjson是一款由阿里巴巴集团开发的JSON解析库,它由于其灵活、高效、易用等优势,已经成为Java开发领域中使用最广泛的JSON解析库之一。下面,我将结合示例说明,讲解如何使用Fastjson这款超好用的JSON解析库。 1. 引入Fastjson依赖 首先,在使用Fastjson之前,我们需要先将其引入到我们的项目中。我们可以通过…

    C 2023年5月23日
    00
  • C++实现学生信息管理系统(完整版)

    C++实现学生信息管理系统(完整版)攻略 准备工作 首先,在开始编写C++代码前,需要先配置好C++编译环境,比如Visual Studio或者Code::Blocks等等。 第二,我们需要了解一些基本的C++语法,比如变量、数据类型、函数等等。 实现步骤 步骤一:设计数据结构 在开始编写实现学生信息管理系统的程序之前,需要首先设计好数据结构。这里我们考虑使…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部