精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

以聰明的方式對(duì)Python進(jìn)行編碼

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Mohammed Billoo ? 2022-11-17 15:45 ? 次閱讀

我們利用Percepio的Tracealyzer來(lái)深入了解同一算法的兩種不同實(shí)現(xiàn)的性能。具體來(lái)說(shuō),我們確定使用迭代函數(shù)而不是遞歸函數(shù)實(shí)現(xiàn)生成斐波那契數(shù)列的算法性能更高。我們不需要在序列中生成大量條目并測(cè)量時(shí)間來(lái)識(shí)別性能差異;相反,我們能夠使用 Tracealyzer 讓我們深入了解實(shí)現(xiàn)的性能,同時(shí)在序列中僅生成 10 個(gè)條目。

由于斐波那契序列生成器是在 Python 中實(shí)現(xiàn)的,讓我們進(jìn)一步擴(kuò)展一下。關(guān)于StackOverflow的一些主要問(wèn)題與特定算法的最有效和“Pythonic”實(shí)現(xiàn)有關(guān)。在本文中,我們將研究一個(gè)流行的操作:反轉(zhuǎn)列表。

根據(jù)以下關(guān)于 StackOverflow 的問(wèn)題,在反轉(zhuǎn)列表時(shí),關(guān)于一個(gè)實(shí)現(xiàn)相對(duì)于另一個(gè)實(shí)現(xiàn)的性能存在一些爭(zhēng)論。為了深入了解差異,我們可以在一個(gè)簡(jiǎn)單的應(yīng)用程序中實(shí)現(xiàn)這兩種技術(shù),如下面的列表所示;我們還包括必要的源代碼,以捕獲 Tracealyzer 評(píng)估每個(gè)實(shí)現(xiàn)的性能所需的標(biāo)記:

import logging

def example():

list_basis = list(range(10))

logging.basicConfig()

logger = logging.getLogger(‘my-logger’)

logger.info(‘Start’)

reverse_list = reversed(list_basis)

logger.info(‘Stop’)

logger.info(‘Start’)

reverse_list = list_basis[::-1]

logger.info(‘Stop’)

if __name__ == ‘__main__’:

example()

我們創(chuàng)建了一個(gè)包含 10 個(gè)元素的列表,并使用內(nèi)置的“反轉(zhuǎn)”函數(shù)以及 Python 中稱為“切片”的技術(shù)來(lái)反轉(zhuǎn)列表。切片只是獲取列表中的某些元素并將它們返回到新列表;在我們的例子中,我們正在切片整個(gè)列表,但向后遍歷。

與上一篇博客文章一樣,我們可以創(chuàng)建一個(gè) LTTng 會(huì)話,運(yùn)行我們的 Python 腳本,在 Tracealyzer 中打開(kāi)生成的跟蹤,并評(píng)估結(jié)果:

我們可以看到,使用反向函數(shù)的實(shí)現(xiàn)大約需要 475 微秒,使用切片的實(shí)現(xiàn)大約需要 360 微秒。

讓我們看看當(dāng)我們將初始列表中的元素?cái)?shù)量增加 10 倍時(shí)會(huì)發(fā)生什么,從而得到一個(gè)由 100 個(gè)元素組成的列表:

import lttngust

import logging

def example():

list_basis = list(range(100))

logging.basicConfig()

logger = logging.getLogger(‘my-logger’)

logger.info(‘Start’)

reverse_list = reversed(list_basis)

logger.info(‘Stop’)

logger.info(‘Start’)

reverse_list = list_basis[::-1]

logger.info(‘Stop’)

if __name__ == ‘__main__’:

example()

同樣,我們重新運(yùn)行必要的步驟來(lái)創(chuàng)建 LTTng 會(huì)話,運(yùn)行我們的應(yīng)用程序,并在 Tracealyzer 中打開(kāi)生成的跟蹤,它向我們顯示了下圖:

雖然我們看到與以前相同的模式,其中切片技術(shù)比反向函數(shù)表現(xiàn)更好,但我們可以看到,與只有 10 個(gè)元素的結(jié)果相比,這兩種機(jī)制的絕對(duì)時(shí)間幾乎減少了一半。這很有趣,因?yàn)槲覀冾A(yù)計(jì),與 100 個(gè)元素的情況相比,在 10 個(gè)元素的情況下,這兩種技術(shù)所花費(fèi)的時(shí)間應(yīng)該更少。讓我們通過(guò)首先更新 Python 腳本來(lái)收集更多數(shù)據(jù),以允許我們以自動(dòng)方式收集更多數(shù)據(jù):

import lttngust

import logging

import sys

def example(list_size):

list_basis = list(range(list_size))

logging.basicConfig()

logger = logging.getLogger(“my-logger”)

logger.info(“Start”)

reverse_list = reversed(list_basis)

logger.info(“Stop”)

logger.info(“Start”)

reverse_list = list_basis[::-1]

logger.info(“Stop”)

if __name__ == ‘__main__’:

example(int(sys.argv[-1]))

在上面的例子中,我們只是允許自己在列表中傳入我們想要的元素?cái)?shù)量。然后我們可以創(chuàng)建以下 bash 腳本,這將允許我們執(zhí)行 Python 應(yīng)用程序,連續(xù)給它一個(gè) 10 和 100 的參數(shù),收集使用反向函數(shù)和切片方法反轉(zhuǎn)列表所需的時(shí)間,并存儲(chǔ)該數(shù)據(jù);腳本將循環(huán)瀏覽每個(gè)測(cè)試 10 次。

#!/bin/bash

set -e

list_compare() {

echo “Running test with a list size of $1 elements”

lttng create

lttng enable-event --kernel sched_switch

lttng enable-event --python my-logger

lttng start

python3 list_compare.py $1

lttng stop

lttng destroy

}

for i in {1..10}

do

list_compare 10

cp -r ~/lttng-traces/auto* “/home/pi/percepio/elements_10_trace_$i”

chown -R pi: “/home/pi/percepio/elements_10_trace_$i”

mv ~/lttng-traces/auto* ~/lttng-traces/archive/

list_compare 100

cp -r ~/lttng-traces/auto* “/home/pi/percepio/elements_100_trace_$i”

chown -R pi: “/home/pi/percepio/elements_100_trace_$i”

mv ~/lttng-traces/auto* ~/lttng-traces/archive/

done

當(dāng)我們?cè)?Tracealyzer 中打開(kāi)生成的跡線并繪制圖表時(shí),我們會(huì)看到以下趨勢(shì):

黃色和橙色圖表示 10 個(gè)元素列表的反轉(zhuǎn)時(shí)間,綠色和深紅色圖表示 100 個(gè)元素列表的反轉(zhuǎn)時(shí)間相同。我們可以看到一些實(shí)例,其中 10 個(gè)元素列表反轉(zhuǎn)的執(zhí)行時(shí)間與 100 個(gè)元素結(jié)果的執(zhí)行時(shí)間一致。類似地,我們可以看到,有一個(gè)實(shí)例減少了反轉(zhuǎn) 100 個(gè)元素列表的執(zhí)行時(shí)間,并且與反轉(zhuǎn) 10 個(gè)元素列表的執(zhí)行時(shí)間相同。但是,總的來(lái)說(shuō),我們可以看到反轉(zhuǎn) 10 個(gè)元素列表的執(zhí)行時(shí)間大約是反轉(zhuǎn) 100 個(gè)元素列表所需時(shí)間的一半。

也許我們?cè)谇耙粋€(gè)案例中觀察到了這些異常之一?讓我們分析包含 1000 個(gè)元素的結(jié)果:

同樣,我們看到相同的模式,與使用反向功能相比,使用切片技術(shù)花費(fèi)的時(shí)間更少。但是,即使我們?cè)俅螌⒘斜碇械脑財(cái)?shù)量增加了 10 倍(達(dá)到驚人的 1000 個(gè)元素),每個(gè)實(shí)現(xiàn)的時(shí)間與 100 個(gè)元素的時(shí)間大致相同,與只有 10 個(gè)元素相比,時(shí)間仍然是一半的時(shí)間。

讓我們將列表大小增加到 100k 個(gè)元素并觀察結(jié)果:

以前我們觀察到切片技術(shù)花費(fèi)的時(shí)間大約是反向函數(shù)的一半,而在這里我們可以看到相反的情況。事實(shí)上,對(duì)于 100k 個(gè)元素的列表大小,切片技術(shù)花費(fèi)的時(shí)間大約延長(zhǎng)了 15 倍!

總之,我們從這個(gè)簡(jiǎn)單的練習(xí)中獲得了一些寶貴的見(jiàn)解。首先,與反向函數(shù)相比,切片技術(shù)似乎花費(fèi)的時(shí)間更少,對(duì)于“幾個(gè)”元素的列表大小(最多 1000)。但是,當(dāng)我們將列表大小增加到 100k 個(gè)元素時(shí),我們可以看到切片技術(shù)比反向函數(shù)花費(fèi)大約 15 倍的時(shí)間。其次,當(dāng)我們運(yùn)行較小大小列表的多次迭代時(shí),我們確實(shí)注意到反轉(zhuǎn)包含 100 個(gè)元素的列表的時(shí)間與反轉(zhuǎn)包含 10 個(gè)元素的列表的時(shí)間大致相同的實(shí)例;然而,總體趨勢(shì)是,反轉(zhuǎn)包含 10 個(gè)元素的列表比反轉(zhuǎn)包含 100 個(gè)元素的列表花費(fèi)的時(shí)間更少,這是意料之中的!我們可以更詳細(xì)地分析Tracealyzer捕獲的痕跡,以了解觀察到的異常的原因。

這里的關(guān)鍵要點(diǎn)是,Percepio 的 Tracealyzer 使我們能夠在沒(méi)有太多儀器基礎(chǔ)設(shè)施的情況下執(zhí)行這種詳細(xì)的分析;我們能夠辨別出大約 100 微秒的性能數(shù)字!

由于Python一直是機(jī)器學(xué)習(xí)的流行語(yǔ)言,因此我們必須擁有一個(gè)工具,可以快速將一種算法的性能與另一種算法的性能進(jìn)行比較。我們可以開(kāi)發(fā)一些小函數(shù)來(lái)隔離我們要評(píng)估的算法,并使用 Tracealyzer 為我們提供有關(guān)算法在不同維度的性能的必要見(jiàn)解。Tracealyzer還可以快速發(fā)現(xiàn)可能需要進(jìn)一步分析的異常行為。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4306

    瀏覽量

    62431
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4782

    瀏覽量

    84453
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何在程序中編碼方式來(lái)控制JBOSS

    上一節(jié)已經(jīng)學(xué)習(xí)了CLI命令行來(lái)控制JBOSS,如果想在程序中編碼方式來(lái)控制JBOSS,可以參考下面的代碼,實(shí)際上在前面的文章,用代碼控制Jboss上的DataSource,已經(jīng)有所接觸了,API與CLI是完全等價(jià)的,一個(gè)是人工
    發(fā)表于 08-05 06:24

    圍繞神經(jīng)網(wǎng)絡(luò)知識(shí)和網(wǎng)絡(luò)應(yīng)用方式展開(kāi)Python和R語(yǔ)言實(shí)戰(zhàn)編碼

    本文將圍繞神經(jīng)網(wǎng)絡(luò)構(gòu)建的基礎(chǔ)知識(shí)展開(kāi),并集中討論網(wǎng)絡(luò)的應(yīng)用方式,用Python和R語(yǔ)言實(shí)戰(zhàn)編碼
    的頭像 發(fā)表于 12-28 10:07 ?4542次閱讀
    圍繞神經(jīng)網(wǎng)絡(luò)知識(shí)和網(wǎng)絡(luò)應(yīng)用<b class='flag-5'>方式</b>展開(kāi)<b class='flag-5'>Python</b>和R語(yǔ)言實(shí)戰(zhàn)<b class='flag-5'>編碼</b>

    學(xué)習(xí)Python的最佳方式取決于你個(gè)人的學(xué)習(xí)方式

    了 Django 和其他流行的 Python Web 框架,為 Python Web 開(kāi)發(fā)人員提供了關(guān)鍵技能。該站點(diǎn)還為初學(xué)者,中級(jí) Python 開(kāi)發(fā)人員和其他編程語(yǔ)言的有經(jīng)驗(yàn)的編碼
    的頭像 發(fā)表于 03-21 09:28 ?2519次閱讀
    學(xué)習(xí)<b class='flag-5'>Python</b>的最佳<b class='flag-5'>方式</b>取決于你個(gè)人的學(xué)習(xí)<b class='flag-5'>方式</b>

    CRC算法原理和CRC編碼的實(shí)現(xiàn)方式與使用Verilog對(duì)CRC編碼進(jìn)行描述

    泛的是CRC-32 標(biāo)準(zhǔn)。本文將以CRC-32 為例,說(shuō)明CRC 編碼的實(shí)現(xiàn)方式以及如何用verilog 語(yǔ)言對(duì)CRC 編碼進(jìn)行描述。
    發(fā)表于 08-06 16:39 ?36次下載
    CRC算法原理和CRC<b class='flag-5'>編碼</b>的實(shí)現(xiàn)<b class='flag-5'>方式</b>與使用Verilog對(duì)CRC<b class='flag-5'>編碼</b><b class='flag-5'>進(jìn)行</b>描述

    如何使用Python Turtle進(jìn)行編碼

     可以做更多的事情,本教程只是為了讓您領(lǐng)略并繼續(xù)前進(jìn)。有關(guān)更多信息,請(qǐng)查看Python Turtle文檔,
    的頭像 發(fā)表于 01-29 17:51 ?2343次閱讀

    NVIDIA推出適用于Python的VPF,簡(jiǎn)化開(kāi)發(fā)GPU加速視頻編碼/解碼

    NVIDIA推出了適用于Python的開(kāi)源視頻處理框架“VideoProcessingFramework”(VPF)。據(jù)悉,VPF 是一組開(kāi)源的C ++庫(kù)和Python綁定,可與其封閉源代碼Codec SDK進(jìn)行交互。該框架的功
    的頭像 發(fā)表于 12-18 14:25 ?6963次閱讀

    AI和聰明的算法之間的區(qū)別在于它的編程方式

    AI和聰明的算法之間的區(qū)別在于它的編程方式。如果您是最終用戶或消費(fèi)者,則可以在兩點(diǎn)上與計(jì)算機(jī)系統(tǒng)或技術(shù)進(jìn)行交互:1 /起點(diǎn)-收集輸入并輸入到系統(tǒng)中;
    的頭像 發(fā)表于 04-11 09:51 ?3246次閱讀

    Python的學(xué)習(xí)和使用經(jīng)驗(yàn)說(shuō)明

    本文對(duì)Python 的版本選擇, IDE 選擇及編碼的解決方案進(jìn)行了一番詳細(xì)的描述,實(shí)為Python 開(kāi)發(fā)人員必讀的Python 學(xué)習(xí)經(jīng)驗(yàn)心
    發(fā)表于 09-01 16:46 ?16次下載
    <b class='flag-5'>Python</b>的學(xué)習(xí)和使用經(jīng)驗(yàn)說(shuō)明

    懶惰的方式對(duì)電阻器進(jìn)行排序

    電子發(fā)燒友網(wǎng)站提供《懶惰的方式對(duì)電阻器進(jìn)行排序.zip》資料免費(fèi)下載
    發(fā)表于 10-27 10:28 ?2次下載
    <b class='flag-5'>以</b>懶惰的<b class='flag-5'>方式</b>對(duì)電阻器<b class='flag-5'>進(jìn)行</b>排序

    Python對(duì)txt進(jìn)行讀寫(xiě)操作

    Python對(duì)txt進(jìn)行讀寫(xiě)操作
    的頭像 發(fā)表于 01-11 15:16 ?797次閱讀

    QM:現(xiàn)代方式對(duì)Arduino進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《QM:現(xiàn)代方式對(duì)Arduino進(jìn)行編程.zip》資料免費(fèi)下載
    發(fā)表于 06-15 10:21 ?0次下載
    QM:<b class='flag-5'>以</b>現(xiàn)代<b class='flag-5'>方式</b>對(duì)Arduino<b class='flag-5'>進(jìn)行</b>編程

    Python中的默認(rèn)編碼

    ####1. Python源代碼文件的執(zhí)行過(guò)程 我們都知道,磁盤(pán)上的文件都是以二進(jìn)制格式存放的,其中文本文件都是以某種特定編碼的字節(jié)形式存放的。對(duì)于程序源代碼文件的字符編碼是由編輯器指定的,比如
    的頭像 發(fā)表于 07-05 16:11 ?1099次閱讀
    <b class='flag-5'>Python</b>中的默認(rèn)<b class='flag-5'>編碼</b>

    Python字符編碼轉(zhuǎn)換

    UNICODE字符串可以與任意字符編碼的字節(jié)進(jìn)行相互轉(zhuǎn)換,如圖: 那么大家很容易想到一個(gè)問(wèn)題,就是不同的字符編碼的字節(jié)可以通過(guò)Unicode相互轉(zhuǎn)換嗎?答案是肯定的。 Python2中
    的頭像 發(fā)表于 07-05 16:25 ?1058次閱讀
    <b class='flag-5'>Python</b>字符<b class='flag-5'>編碼</b>轉(zhuǎn)換

    利用Python發(fā)送郵件的 3 種方式

    Python 發(fā)送郵件的 3 種方式 2. 準(zhǔn)備 126 郵箱為例,在編碼之前,我們需要開(kāi)啟 SMTP 服務(wù) 然后,手動(dòng)新增一個(gè)授權(quán)碼 其中,賬號(hào)、授權(quán)碼和服務(wù)器地址用于連接登錄
    的頭像 發(fā)表于 11-02 11:37 ?935次閱讀

    ARM中的編碼方式與尋址方式有何不同?

    ARM中的編指方式與尋址方式有何不同? ARM處理器是一種廣泛應(yīng)用的微處理器架構(gòu),被廣泛用于移動(dòng)設(shè)備、嵌入式設(shè)備以及智能家居等領(lǐng)域。在ARM架構(gòu)中,編碼方式和尋址
    的頭像 發(fā)表于 01-29 18:10 ?642次閱讀