在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

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

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

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

根據(jù)以下關(guān)于 StackOverflow 的問題,在反轉(zhuǎn)列表時,關(guān)于一個實現(xiàn)相對于另一個實現(xiàn)的性能存在一些爭論。為了深入了解差異,我們可以在一個簡單的應(yīng)用程序中實現(xiàn)這兩種技術(shù),如下面的列表所示;我們還包括必要的源代碼,以捕獲 Tracealyzer 評估每個實現(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)建了一個包含 10 個元素的列表,并使用內(nèi)置的“反轉(zhuǎn)”函數(shù)以及 Python 中稱為“切片”的技術(shù)來反轉(zhuǎn)列表。切片只是獲取列表中的某些元素并將它們返回到新列表;在我們的例子中,我們正在切片整個列表,但向后遍歷。

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

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

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

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)行必要的步驟來創(chuàng)建 LTTng 會話,運(yùn)行我們的應(yīng)用程序,并在 Tracealyzer 中打開生成的跟蹤,它向我們顯示了下圖:

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

在上面的例子中,我們只是允許自己在列表中傳入我們想要的元素數(shù)量。然后我們可以創(chuàng)建以下 bash 腳本,這將允許我們執(zhí)行 Python 應(yīng)用程序,連續(xù)給它一個 10 和 100 的參數(shù),收集使用反向函數(shù)和切片方法反轉(zhuǎn)列表所需的時間,并存儲該數(shù)據(jù);腳本將循環(huán)瀏覽每個測試 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)我們在 Tracealyzer 中打開生成的跡線并繪制圖表時,我們會看到以下趨勢:

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

也許我們在前一個案例中觀察到了這些異常之一?讓我們分析包含 1000 個元素的結(jié)果:

同樣,我們看到相同的模式,與使用反向功能相比,使用切片技術(shù)花費(fèi)的時間更少。但是,即使我們再次將列表中的元素數(shù)量增加了 10 倍(達(dá)到驚人的 1000 個元素),每個實現(xiàn)的時間與 100 個元素的時間大致相同,與只有 10 個元素相比,時間仍然是一半的時間。

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

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

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

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

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

審核編輯:郭婷

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

    關(guān)注

    3

    文章

    4338

    瀏覽量

    62752
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4800

    瀏覽量

    84820
收藏 人收藏

    評論

    相關(guān)推薦

    如何在程序中編碼方式來控制JBOSS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    電子發(fā)燒友網(wǎng)站提供《QM:現(xiàn)代方式對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>對Arduino<b class='flag-5'>進(jìn)行</b>編程

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

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

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

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

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

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

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

    ARM中的編指方式與尋址方式有何不同? ARM處理器是一種廣泛應(yīng)用的微處理器架構(gòu),被廣泛用于移動設(shè)備、嵌入式設(shè)備以及智能家居等領(lǐng)域。在ARM架構(gòu)中,編碼方式和尋址
    的頭像 發(fā)表于 01-29 18:10 ?717次閱讀
    主站蜘蛛池模板: 美女扒开尿口给男人桶爽视频 | 在线一级毛片| 美女张开腿让男生桶出水| 亚洲福利秒拍一区二区| 性夜黄 a 爽免费看| 综合久久婷婷| 婷婷免费视频| 欧美性天堂| 国产亚洲第一伦理第一区| 波多野结衣在线观看一区二区三区| 成人精品在线观看| 天天碰天天操| 成人国产永久福利看片| xx性欧美高清| 在线观看国产精美视频| 色老头综合| 国产免费高清视频在线观看不卡| 久久久夜| 69日本人xxxx16-18| 妇女交性大片| 三级理论在线观看| 激情啪啪网站| 五月天亚洲综合| 99国产福利| 免费看黄视频的网站| 深爱五月激情五月| 一级做a爰片久久免费| 天堂网在线看| 久久精品亚瑟全部免费观看| 中国一级特黄剌激爽毛片| 久久最新精品| 亚洲一区欧美二区| 亚洲国产精品嫩草影院| 免费一级特黄a| 亚洲午夜久久影院| 99热这里只有精品69| 东京加勒比| 年轻人影院www你懂的| 一级毛片免费不卡直观看| yy8090韩国日本三理论免费| 精彩视频一区二区三区|