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日

相关文章

  • C语言进度条的实现原理详解

    关于C语言进度条的实现原理,可以分为两种方式实现:字符型进度条和图形进度条。 一、字符型进度条的实现原理 第一步是计算进度占比,也就是当前进度值除以总进度值。 第二步是将进度值转化为对应的进度条字符。 第三步是将进度条字符动态地输出到终端。 最后一步是在进度完成时保持进度条的完整性。 下面是一个简单的字符型进度条的实现示例: #include <std…

    C 2023年5月23日
    00
  • C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南 C语言作为一门编程语言,具有严谨、简洁、高效的特点。为了使得代码易于维护、易于理解、易于扩展,需要遵守一些语法风格与代码书写规范。 命名规范 变量名、函数名等采用小写字母加下划线的方式,如:user_id 宏定义采用全部大写的方式,如:#define MAX_NUM 100 结构体名、枚举类型名首字母大写,采用驼峰命名法,…

    C 2023年5月23日
    00
  • 神乐千鹤在拳皇97、98中的高级用法

    神乐千鹤在拳皇97、98中的高级用法攻略 什么是神乐千鹤? 神乐千鹤是拳皇系列游戏中的一位角色,拥有快速的移动速度和敏捷的攻击方式。她在拳皇97和98中的操作难度较高,但是如果掌握了她的高级用法,就可以轻松地击败对手。 神乐千鹤的高级用法 1. 投掷连击 神乐千鹤的投掷连击是一种非常强大的攻击方式。要进行投掷连击,首先需要进行一次投掷攻击(按下前+C),然后…

    C 2023年5月22日
    00
  • 利用idea搭建SSM项目看这一篇就够了

    以下是详细讲解“利用idea搭建SSM项目看这一篇就够了”的完整攻略,其中包含两个示例说明。 1. 确定开发环境 要开发SSM项目,需要先确定好我们的开发环境。我们需要安装以下软件: JDK:Java Development Kit。 Tomcat:Web服务器,用于部署项目。 MySQL:关系型数据库系统。 Maven:Java项目的构建工具。 IDEA:…

    C 2023年5月23日
    00
  • python中常用的各种数据库操作模块和连接实例

    连接数据库是Python中非常重要的操作之一。Python中有很多数据库操作模块,比如官方的sqlite3模块,以及第三方的MySQLdb和pymongo等模块。下面就对这些模块及其使用做一个详细的介绍和示例说明。 sqlite3模块 官方sqlite3模块是Python内置的模块,它可以通过Python与SQLite数据库进行交互。它允许我们执行SQL语句…

    C 2023年5月23日
    00
  • springmvc HttpServletRequest 如何获取c:forEach的值

    要获取c:forEach的值,需要进行以下步骤: 1. 在JSP页面中使用c:forEach标签 首先,在JSP页面中使用c:forEach标签遍历集合数据。例如: <c:forEach items="${userList}" var="user"> <tr> <td>${user.…

    C 2023年5月23日
    00
  • 如何在TC2.0中调用汇编程序

    当我们需要使用汇编语言实现某些特定的功能,或者需要使用一些特殊的指令时,可以考虑在TC2.0中调用汇编程序。下面是在TC2.0中调用汇编程序的详细攻略: 1. 创建汇编源文件 首先,需要创建一个汇编文件,以实现所需的功能。在Windows环境中,可以使用文本编辑器或者IDE,比如Notepad++,来创建汇编文件。以MASM语法为例,文件的扩展名应为.asm…

    C 2023年5月23日
    00
  • Qt物联网管理平台之实现自动清理早期数据功能

    Qt物联网管理平台之实现自动清理早期数据功能 引言 随着物联网技术的发展,设备上传的数据越来越多,对数据存储和查询的要求也越来越高。然而,大量的历史数据会占用大量的存储空间,对系统造成一定的负担。因此,需要实现自动清理早期数据的功能,以减少系统负担。 本文将介绍如何在Qt物联网管理平台中实现自动清理早期数据功能。 实现方法 1. 数据库设计 首先,需要对数据…

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