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日

相关文章

  • VC程序在Win32环境下动态链接库(DLL)编程原理

    VC程序在Win32环境下动态链接库(DLL)编程,主要原理是将一些可重复利用的函数和资源封装进动态链接库文件中,再由其他程序在需要时进行调用,从而提高代码重用性和程序的简洁性。以下是详细的攻略: 1. 创建DLL工程 首先,在VC中新建Win32 DLL工程,在“Win32 Application Wizard”对话框中选择“DLL”类型,之后通过向导一步…

    C 2023年5月23日
    00
  • 详细分析C++ 信号处理

    详细分析C++信号处理 什么是信号处理? 信号处理是一种处理外部事件的方法。在Linux环境下,当一个进程接收到某种事件信号时,操作系统会发送一个信号给该进程。通过信号处理函数,进程可以对该信号进行处理。 如何在C++中进行信号处理? 在C++中,可以通过POSIX标准的signal()函数来设置信号处理函数。以下是使用signal()函数的代码示例: #i…

    C 2023年5月23日
    00
  • C程序 将两个矩阵相加

    首先,写一个程序可以将两个矩阵相加,需要按照以下步骤进行: 定义两个矩阵,并初始化数据 定义一个结果矩阵 遍历两个矩阵,并将对应元素相加,然后存放到结果矩阵中 输出结果矩阵 下面是一个标准的C程序代码示例: #include <stdio.h> #define ROW 2 #define COL 2 void matrix_add(int mat…

    C 2023年5月9日
    00
  • springboot-dubbo cannot be cast to问题及解决

    “springboot-dubbo cannot be cast to”问题往往会在Spring Boot项目中使用Dubbo时出现。该问题出现的原因往往是因为Dubbo的版本与Spring Boot的版本不兼容导致Dubbo不能正确地使用Spring Boot的自动配置机制。下面将详细介绍该问题的解决方法。 步骤1:检查Dubbo版本与Spring Boo…

    C 2023年5月23日
    00
  • 最终幻想15(FF15)升级系统与经验魔法计算公式

    最终幻想15(FF15)是一款由日本Square Enix制作的动作角色扮演游戏。在游戏中,升级和经验是游戏中非常重要的要素,本文将详细介绍FF15的升级系统和经验魔法计算公式,以帮助玩家们更好地理解和利用这些要素。 1. 升级系统介绍 在FF15中,升级可以提高角色的属性和技能,使其在战斗中更加强大。角色等级的最高上限是120级。每当角色升级时,将会获得相…

    C 2023年5月23日
    00
  • c++中try catch的用法小结

    当在C++代码中使用异常处理时,我们必须使用“try-catch”块来捕捉和处理异常。下面是一些关于“C++中try catch的用法小结”的攻略: 一、try-catch块的基本用法 使用try-catch块来捕捉异常,代码块包围了可能引发异常的代码。 try { //可能引发异常的代码 } catch(ExceptionType name) { //处理…

    C 2023年5月22日
    00
  • 如何在抖音卖课程?在抖音上卖课程方式汇总

    如何在抖音卖课程? 要在抖音上卖课程,以下步骤值得一试: 步骤一:申请店铺账号 想要在抖音上卖课程,首先需要注册店铺账号并认证。 1.进入抖店(抖音商家后台),根据提示注册店铺账号。 2.填写相关信息,提交认证材料。 步骤二:准备课程内容 在抖音上卖课程需要有足够的课程内容,要为用户提供有价值的学习体验。 1.根据目标用户和市场需求,确定课程内容、形式等。 …

    C 2023年5月22日
    00
  • C语言实现的猴子偷桃之类算法

    C语言实现的猴子偷桃之类算法 算法思路 猴子偷桃是一个经典的算法问题,其思路如下: 有一堆桃子,猴子第一天吃掉一半,发现还不过瘾,就又吃了一个;第二天又吃掉剩下的一半,发现还不过瘾,又吃了一个;以后每天都这样吃,直到最后只剩一个桃子为止。求原来有多少桃子。 为了方便解题,我们可以反向思考,即从最后一天向前推断。假设在第N天时只剩下一个桃子,那么在第N-1天时…

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