色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

以聰明的方式對Python進行編碼

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

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

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

根據以下關于 StackOverflow 的問題,在反轉列表時,關于一個實現相對于另一個實現的性能存在一些爭論。為了深入了解差異,我們可以在一個簡單的應用程序中實現這兩種技術,如下面的列表所示;我們還包括必要的源代碼,以捕獲 Tracealyzer 評估每個實現的性能所需的標記:

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()

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

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

我們可以看到,使用反向函數的實現大約需要 475 微秒,使用切片的實現大約需要 360 微秒。

讓我們看看當我們將初始列表中的元素數量增加 10 倍時會發生什么,從而得到一個由 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()

同樣,我們重新運行必要的步驟來創建 LTTng 會話,運行我們的應用程序,并在 Tracealyzer 中打開生成的跟蹤,它向我們顯示了下圖:

雖然我們看到與以前相同的模式,其中切片技術比反向函數表現更好,但我們可以看到,與只有 10 個元素的結果相比,這兩種機制的絕對時間幾乎減少了一半。這很有趣,因為我們預計,與 100 個元素的情況相比,在 10 個元素的情況下,這兩種技術所花費的時間應該更少。讓我們通過首先更新 Python 腳本來收集更多數據,以允許我們以自動方式收集更多數據:

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]))

在上面的例子中,我們只是允許自己在列表中傳入我們想要的元素數量。然后我們可以創建以下 bash 腳本,這將允許我們執行 Python 應用程序,連續給它一個 10 和 100 的參數,收集使用反向函數和切片方法反轉列表所需的時間,并存儲該數據;腳本將循環瀏覽每個測試 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

當我們在 Tracealyzer 中打開生成的跡線并繪制圖表時,我們會看到以下趨勢:

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

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

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

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

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

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

這里的關鍵要點是,Percepio 的 Tracealyzer 使我們能夠在沒有太多儀器基礎設施的情況下執行這種詳細的分析;我們能夠辨別出大約 100 微秒的性能數字!

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

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62688
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84752
收藏 人收藏

    評論

    相關推薦

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

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

    圍繞神經網絡知識和網絡應用方式展開Python和R語言實戰編碼

    本文將圍繞神經網絡構建的基礎知識展開,并集中討論網絡的應用方式,用Python和R語言實戰編碼
    的頭像 發表于 12-28 10:07 ?4568次閱讀
    圍繞神經網絡知識和網絡應用<b class='flag-5'>方式</b>展開<b class='flag-5'>Python</b>和R語言實戰<b class='flag-5'>編碼</b>

    學習Python的最佳方式取決于你個人的學習方式

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

    CRC算法原理和CRC編碼的實現方式與使用Verilog對CRC編碼進行描述

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

    如何使用Python Turtle進行編碼

     可以做更多的事情,本教程只是為了讓您領略并繼續前進。有關更多信息,請查看Python Turtle文檔,
    的頭像 發表于 01-29 17:51 ?2375次閱讀

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

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

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

    AI和聰明的算法之間的區別在于它的編程方式。如果您是最終用戶或消費者,則可以在兩點上與計算機系統或技術進行交互:1 /起點-收集輸入并輸入到系統中;
    的頭像 發表于 04-11 09:51 ?3294次閱讀

    Python的學習和使用經驗說明

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

    懶惰的方式對電阻器進行排序

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

    Python對txt進行讀寫操作

    Python對txt進行讀寫操作
    的頭像 發表于 01-11 15:16 ?827次閱讀

    QM:現代方式對Arduino進行編程

    電子發燒友網站提供《QM:現代方式對Arduino進行編程.zip》資料免費下載
    發表于 06-15 10:21 ?0次下載
    QM:<b class='flag-5'>以</b>現代<b class='flag-5'>方式</b>對Arduino<b class='flag-5'>進行</b>編程

    Python中的默認編碼

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

    Python字符編碼轉換

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

    利用Python發送郵件的 3 種方式

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

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

    ARM中的編指方式與尋址方式有何不同? ARM處理器是一種廣泛應用的微處理器架構,被廣泛用于移動設備、嵌入式設備以及智能家居等領域。在ARM架構中,編碼方式和尋址
    的頭像 發表于 01-29 18:10 ?703次閱讀
    主站蜘蛛池模板: 快播免费电影| 成人国产亚洲精品A区天堂蜜臀| 激情床戏揉胸吃胸视频| jizzzz亚洲丰满xxxx| 亚洲精品视频在线播放| 强奷表妺好紧2| 啦啦啦WWW在线观看免费高清版| 国产精品 中文字幕 亚洲 欧美 | 欧美日韩另类在线专区| 狠狠狠狠狠狠干| 国产成+人+综合+亚洲不卡| 51无码人妻精品1国产| 亚洲精品国偷拍自产在线| 日韩a在线看免费观看视频| 美女岔开腿露出粉嫩花苞| 狠狠爱亚洲五月婷婷av| 国产成人免费不卡在线观看| 99热在线观看| 中文字幕久久久| 一扒二脱三插片在线观看| 亚洲 综合 欧美在线视频| 日韩精品专区在线影院重磅| 麻豆国产人妻精品无码AV| 久草色香蕉视频在线| 国产午夜精品一区理论片飘花| 成人国产在线看不卡| 99精品99| 4399亚洲AV无码V无码网站| 一个人的视频在线观看免费观看 | 国内极度色诱视频网站| 国产成人免费网站在线观看| 99视频免费在线| 91精品国产色综合久久不| 中文字幕亚洲无线码一区| 一个人在线观看免费视频| 亚洲一区免费在线观看| 亚洲人人为我我为人人| 亚洲人成在线观看一区二区| 亚洲精品AV一区午夜福利| 亚洲乱码国产一区三区| 亚洲人成网站在线播放|