溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python如何做代碼性能分析

發(fā)布時間:2021-04-26 14:03:52 來源:億速云 閱讀:253 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下python如何做代碼性能分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Python的優(yōu)點有哪些

1、簡單易用,與C/C++、Java、C# 等傳統(tǒng)語言相比,Python對代碼格式的要求沒有那么嚴(yán)格;2、Python屬于開源的,所有人都可以看到源代碼,并且可以被移植在許多平臺上使用;3、Python面向?qū)ο?,能夠支持面向過程編程,也支持面向?qū)ο缶幊蹋?、Python是一種解釋性語言,Python寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序;5、Python功能強大,擁有的模塊眾多,基本能夠?qū)崿F(xiàn)所有的常見功能。

cProfile

cProfile是python默認的性能分析器,他只測量CPU時間,并不關(guān)心內(nèi)存消耗和其他與內(nèi)存相關(guān)聯(lián)的信息。

from time import sleep
import random


def random_list(start, end, length):
    """
    生成隨機列表
    :param start: 隨機開始數(shù)
    :param end: 隨機結(jié)束數(shù)
    :param length: 列表長度
    """
    data_list = []
    for i in range(length):
        data_list.append(random.randint(start, end))
    return data_list


def bubble_sort(arr):
    """
    冒泡排序: 對列表進行排序
    :param arr 列表
    """
    n = len(arr)
    sleep(1)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


if __name__ == '__main__':
    get_data_list = random_list(1, 99, 10)

    import cProfile
    cProfile.run('bubble_sort({})'.format(get_data_list))

繼續(xù)使用上一篇文章中的例子,引用cProfile模塊,run()方法參數(shù)說明。

run(statement, filename=None, sort=-1)

  • statement: 需要測試的代碼或者函數(shù)(函數(shù)名)

  • fielname: 結(jié)果保存的位置, 默認為stdout

  • sort: 結(jié)果排序方法,常用的有cumtime: 累積時間, name: 函數(shù)名, line: 行號

為了使結(jié)果統(tǒng)計出耗時部分,我們加了sleep,結(jié)果如下:

? python demo.py
         6 function calls in 1.004 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.004    1.004 <string>:1(<module>)
        1    0.000    0.000    1.004    1.004 demo.py:19(bubble_sort)
        1    0.000    0.000    1.004    1.004 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.len}
        1    1.004    1.004    1.004    1.004 {built-in method time.sleep}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
  • 6 function calls in 1.004 seconds 6個函數(shù)調(diào)用被監(jiān)控,耗時1.004秒。

  • ncalls 函數(shù)被調(diào)用的次數(shù)。如果這一列有兩個值,就表示有遞歸調(diào)用,第二個值是原生調(diào)用次數(shù),第一個值是總調(diào)用次數(shù)。

  • tottime 函數(shù)內(nèi)部消耗的總時間。(可以幫助優(yōu)化)

  • percall 是tottime除以ncalls,一個函數(shù)每次調(diào)用平均消耗時間。

  • cumtime 之前所有子函數(shù)消費時間的累計和。

  • filename:lineno(function) 被分析函數(shù)所在文件名、行號、函數(shù)名。

line_profiler

line_profiler 可以提供有關(guān)時間是如何在各行之間分配的信息,直白一點就是給出程序每行的耗時,在無法確定哪行語句最浪費時間,這很有用。

line_profiler是一個第三方模塊,需要安裝。

https://github.com/pyutils/line_profiler

from time import sleep
import random


def random_list(start, end, length):
    """
    生成隨機列表
    :param start: 隨機開始數(shù)
    :param end: 隨機結(jié)束數(shù)
    :param length: 列表長度
    """
    data_list = []
    for i in range(length):
        data_list.append(random.randint(start, end))
    return data_list


@profile
def bubble_sort(arr):
    """
    冒泡排序: 對列表進行排序
    :param arr 列表
    """
    n = len(arr)
    sleep(1)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


if __name__ == '__main__':
    get_data_list = random_list(1, 99, 10)
    bubble_sort(get_data_list)

給需要監(jiān)控的函數(shù)加上@profile 裝飾器。通過kernprof命令運行文件(安裝完line_profiler生成的命令)。

參數(shù)說明:

  • -l:以使用函數(shù)line_profiler

  • -v:以立即將結(jié)果打印到屏幕

運行結(jié)果:

kernprof -l -v demo.py
Wrote profile results to demo.py.lprof
Timer unit: 1e-06 s

Total time: 1.00416 s
File: demo.py
Function: bubble_sort at line 18

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    18                                           @profile
    19                                           def bubble_sort(arr):
    20                                               """
    21                                               冒泡排序: 對列表進行排序
    22                                               :param arr 列表
    23                                               """
    24         1          8.0      8.0      0.0      n = len(arr)
    25         1    1004030.0 1004030.0    100.0      sleep(1)
    26        11         15.0      1.4      0.0      for i in range(n):
    27        55         44.0      0.8      0.0          for j in range(0, n - i - 1):
    28        45         41.0      0.9      0.0              if arr[j] > arr[j + 1]:
    29        20         21.0      1.1      0.0                  arr[j], arr[j + 1] = arr[j + 1], arr[j]
    30         1          1.0      1.0      0.0      return arr

輸出非常直觀,分成了6列。

  • Line #:運行的代碼行號。

  • Hits:代碼行運行的次數(shù)。

  • Time:代碼行的執(zhí)行時間,單位為微秒。

  • Per Hit:Time/Hits。

  • % Time:代碼行總執(zhí)行時間所占的百分比。

  • Line Contents:代碼行的內(nèi)容。

只需查看% Time列,就可清楚地知道時間都花在了什么地方。

以上是“python如何做代碼性能分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI