欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python如何做代碼性能分析

 更新時(shí)間:2021年04月26日 11:28:58   作者:蟲師  
這篇文章主要介紹了python如何做代碼性能分析,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

上一篇文章我們介紹了基準(zhǔn)測(cè)試,通過(guò)基準(zhǔn)測(cè)試可以發(fā)現(xiàn)程序變慢了,那么是因?yàn)槭裁丛驅(qū)е滦阅茏兟?,需要進(jìn)一步做代碼性能分析。python同樣提供了性能分析工具。

cProfile

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

from time import sleep
import random


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


def bubble_sort(arr):
    """
    冒泡排序: 對(duì)列表進(jìn)行排序
    :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ù)說(shuō)明。

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

  • statement: 需要測(cè)試的代碼或者函數(shù)(函數(shù)名)
  • fielname: 結(jié)果保存的位置, 默認(rèn)為stdout
  • sort: 結(jié)果排序方法,常用的有cumtime: 累積時(shí)間, name: 函數(shù)名, line: 行號(hào)

為了使結(jié)果統(tǒng)計(jì)出耗時(shí)部分,我們加了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個(gè)函數(shù)調(diào)用被監(jiān)控,耗時(shí)1.004秒。
  • ncalls 函數(shù)被調(diào)用的次數(shù)。如果這一列有兩個(gè)值,就表示有遞歸調(diào)用,第二個(gè)值是原生調(diào)用次數(shù),第一個(gè)值是總調(diào)用次數(shù)。
  • tottime 函數(shù)內(nèi)部消耗的總時(shí)間。(可以幫助優(yōu)化)
  • percall 是tottime除以ncalls,一個(gè)函數(shù)每次調(diào)用平均消耗時(shí)間。
  • cumtime 之前所有子函數(shù)消費(fèi)時(shí)間的累計(jì)和。
  • filename:lineno(function) 被分析函數(shù)所在文件名、行號(hào)、函數(shù)名。

line_profiler

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

line_profiler是一個(gè)第三方模塊,需要安裝。

https://github.com/pyutils/line_profiler

from time import sleep
import random


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


@profile
def bubble_sort(arr):
    """
    冒泡排序: 對(duì)列表進(jìn)行排序
    :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 裝飾器。通過(guò)kernprof命令運(yùn)行文件(安裝完line_profiler生成的命令)。

參數(shù)說(shuō)明:

  • -l:以使用函數(shù)line_profiler
  • -v:以立即將結(jié)果打印到屏幕

運(yùn)行結(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                                               冒泡排序: 對(duì)列表進(jìn)行排序
    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 #:運(yùn)行的代碼行號(hào)。
  • Hits:代碼行運(yùn)行的次數(shù)。
  • Time:代碼行的執(zhí)行時(shí)間,單位為微秒。
  • Per Hit:Time/Hits。
  • % Time:代碼行總執(zhí)行時(shí)間所占的百分比。
  • Line Contents:代碼行的內(nèi)容。

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

總結(jié)

性能測(cè)試分析站在項(xiàng)目層面是一個(gè)很龐大的話題,以前為測(cè)試工程師,關(guān)注的是性能工具的使用,以及用戶維度的性能[1];作為開(kāi)發(fā)工程師,每個(gè)功能都是由一個(gè)個(gè)函數(shù)/方法組成,我們?nèi)シ治雒總€(gè)函數(shù)/方法,甚至是每行代碼的耗時(shí),才能更好的進(jìn)行代碼層面的性能優(yōu)化。

以上就是python如何做代碼性能分析的詳細(xì)內(nèi)容,更多關(guān)于python 代碼性能分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)圖片灰度化以及圖片顯示的兩種方法

    Python實(shí)現(xiàn)圖片灰度化以及圖片顯示的兩種方法

    這篇文章給大家介紹了Python實(shí)現(xiàn)圖片,灰度化以及圖片顯示的兩種方法并通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Python計(jì)算任意多邊形間的重疊面積的示例代碼

    Python計(jì)算任意多邊形間的重疊面積的示例代碼

    最近有個(gè)作業(yè),給定的數(shù)據(jù)為多邊形的各個(gè)頂點(diǎn),為N*2的矩陣,N 為多邊形的頂點(diǎn)個(gè)數(shù),計(jì)算任意兩個(gè)多邊形重疊面積計(jì)算,本文就來(lái)詳細(xì)的介紹一下
    2021-08-08
  • 搞定這套Python爬蟲面試題(面試會(huì)so easy)

    搞定這套Python爬蟲面試題(面試會(huì)so easy)

    Python 是一門開(kāi)源的解釋性語(yǔ)言,相比 Java C++ 等語(yǔ)言,Python 具有動(dòng)態(tài)特性,非常靈活。這篇文章主要介紹了搞定這套Python爬蟲面試題,面試會(huì)so easy,需要的朋友可以參考下
    2019-04-04
  • OpenCV圖像處理之七種常用圖像幾何變換

    OpenCV圖像處理之七種常用圖像幾何變換

    這篇文章主要介紹了OpenCV圖像處理中常用的幾個(gè)圖像幾何變換:裁剪、放大、縮小、平移、錯(cuò)切、鏡像、旋轉(zhuǎn)、透視等。文中示例代碼非常詳細(xì),需要的朋友可以參考一下
    2021-12-12
  • 分享四個(gè)python接口常用封裝函數(shù)

    分享四個(gè)python接口常用封裝函數(shù)

    這篇文章主要給大家分享的是分享四個(gè)python接口常用封裝函數(shù),文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-04-04
  • Python 圖像處理 Pillow 庫(kù)詳情

    Python 圖像處理 Pillow 庫(kù)詳情

    這篇文章主要介紹了Python 圖像處理 Pillow 庫(kù),圖像處理是常用的技術(shù),python 擁有豐富的第三方擴(kuò)展庫(kù),Pillow 是 Python3 最常用的圖像處理庫(kù),目前最高版本5.2.0。Python2 使用Pil庫(kù),兩者是使用方法差不多,區(qū)別在于類的引用不同。下面來(lái)看看文章的詳細(xì)內(nèi)容
    2021-11-11
  • python得到qq句柄,并顯示在前臺(tái)的方法

    python得到qq句柄,并顯示在前臺(tái)的方法

    今天小編就為大家分享一篇python得到qq句柄,并顯示在前臺(tái)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 使用Python實(shí)現(xiàn)MapReduce的示例代碼

    使用Python實(shí)現(xiàn)MapReduce的示例代碼

    MapReduce是一個(gè)用于大規(guī)模數(shù)據(jù)處理的分布式計(jì)算模型,最初由Google工程師設(shè)計(jì)并實(shí)現(xiàn)的,Google已經(jīng)將完整的MapReduce論文公開(kāi)發(fā)布了,本文給大家介紹了使用Python實(shí)現(xiàn)MapReduce的示例代碼,需要的朋友可以參考下
    2024-05-05
  • python sys模塊sys.path使用方法示例

    python sys模塊sys.path使用方法示例

    這篇文章主要介紹了python sys模塊sys.path使用方法,大家參考使用
    2013-12-12
  • python3中確保枚舉值代碼分析

    python3中確保枚舉值代碼分析

    在本篇文章里小編給大家整理的是一篇關(guān)于python3中確保枚舉值代碼分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12

最新評(píng)論