久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > 為什么python這么慢

        為什么python這么慢

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-05 22:05:02 1699193102

        Python越來越受歡迎。它被用于DevOps、數(shù)據(jù)科學(xué)、Web開發(fā)和安全。

        然而,它并沒有贏得任何速度獎(jiǎng)牌。

        就速度而言,Java與C或c++或c#或Python相比如何?

        答案在很大程度上取決于您正在運(yùn)行的應(yīng)用程序的類型。沒有一個(gè)基準(zhǔn)測(cè)試是完美的,但是計(jì)算機(jī)語言基準(zhǔn)測(cè)試游戲是一個(gè)很好的起點(diǎn)。

        十多年來,我一直在參考計(jì)算機(jī)語言基準(zhǔn)測(cè)試游戲;與其他語言如Java、c#、Go、JavaScript、c++相比,Python是最慢的語言之一。這包括JIT(c#,Java)和AOT(C,c++)編譯器,以及解釋語言,如JavaScript。

        注:當(dāng)我說“Python”時(shí),我指的是該語言的參考實(shí)現(xiàn)CPython。Python是一門語言,有語法等規(guī)范。但是落實(shí)到具體實(shí)現(xiàn)上,就不一樣了。用C實(shí)現(xiàn)的叫CPython,也是目前的參考實(shí)現(xiàn)。即最新的語言特性都是在這個(gè)上面先實(shí)現(xiàn),Linux,OSX等自帶的也是這個(gè)版本。用.NET實(shí)現(xiàn)的叫IronPython,Java的叫Jython,用Python實(shí)現(xiàn)的叫PyPy

        我想回答這個(gè)問題:當(dāng)Python比另一種語言慢2-10倍完成一個(gè)可比較的應(yīng)用程序時(shí),為什么它慢,我們不能使它更快?

        以下是最熱門的理論:

        它是GIL(全局解釋器鎖)"因?yàn)樗墙忉屵^的而不是編譯過的因?yàn)樗莿?dòng)態(tài)類型語言

        這些原因中哪一個(gè)對(duì)性能影響最大?

        我們逐個(gè)分析

        1.它是GIL(全局解釋器鎖)

        現(xiàn)代計(jì)算機(jī)的CPU是多核的,有時(shí)也有多個(gè)處理器。為了利用所有這些額外的處理能力,操作系統(tǒng)定義了一個(gè)稱為線程的底層結(jié)構(gòu),其中一個(gè)進(jìn)程(如Chrome瀏覽器)可以衍生多個(gè)線程,并在內(nèi)部為系統(tǒng)提供指令。通過這種方式,如果一個(gè)進(jìn)程是cpu密集型的,那么可以跨內(nèi)核共享負(fù)載,從而有效地使大多數(shù)應(yīng)用程序更快地完成任務(wù)。

        如果您以前沒有做過多線程編程,那么您需要快速熟悉鎖的概念。與單線程進(jìn)程不同,您需要確保在更改內(nèi)存中的變量時(shí),多個(gè)線程不會(huì)嘗試同時(shí)訪問/更改相同的內(nèi)存地址。

        當(dāng)CPython創(chuàng)建變量時(shí),它分配內(nèi)存,然后計(jì)算有多少對(duì)該變量的引用存在,這是一個(gè)稱為引用計(jì)數(shù)的概念。如果引用的數(shù)量為0,那么它將從系統(tǒng)中釋放那塊內(nèi)存。這就是為什么在for循環(huán)的范圍內(nèi)創(chuàng)建“臨時(shí)”變量不會(huì)增加應(yīng)用程序的內(nèi)存消耗。

        當(dāng)變量在多個(gè)線程中共享時(shí),挑戰(zhàn)就變成了CPython如何鎖定引用計(jì)數(shù)。有一個(gè)“全局解釋器鎖”,它小心地控制線程的執(zhí)行。解釋器一次只能執(zhí)行一個(gè)操作,不管它有多少線程。

        那么其他Pythonruntimes呢?

        PyPy有一個(gè)GIL,它通常比CPython快3倍。

        Jython沒有GIL,因?yàn)镴ython中的Python線程由Java線程表示,并且受益于JVM內(nèi)存管理系統(tǒng)。

        JavaScript是如何做到這一點(diǎn)的?

        首先,所有Javascript引擎都使用標(biāo)記-清除垃圾收集。如前所述,GIL的主要需求是CPython的內(nèi)存管理算法。

        JavaScript沒有GIL,但它也是單線程的,所以不需要GIL。JavaScript的事件循環(huán)和承諾/回調(diào)模式是實(shí)現(xiàn)異步編程而不是并發(fā)的方式。Python對(duì)異步事件循環(huán)也有類似的處理。

        2.因?yàn)檫@是一種解釋語言

        我經(jīng)常聽到這種說法,我發(fā)現(xiàn)這是對(duì)CPython實(shí)際工作方式的一種粗略簡化。如果您在終端上編寫了pythonmyscript.py,那么CPython將開始一長串的讀取、詞法分析、解析、編譯、解釋和執(zhí)行這些代碼

        在這個(gè)過程中很重要的一點(diǎn)是創(chuàng)建一個(gè).pyc文件,在編譯器階段,字節(jié)碼序列被寫到Python3上的_pycache__/中的一個(gè)文件中,或者在Python2的相同目錄中。這不僅適用于您的腳本,還適用于您導(dǎo)入的所有代碼,包括第三方模塊。

        所以大多數(shù)時(shí)候(除非您編寫的代碼只運(yùn)行一次?),Python都是解釋字節(jié)碼并在本地執(zhí)行它。與Java和c#.NET相比:Java編譯成“中間語言”,Java虛擬機(jī)讀取字節(jié)碼并及時(shí)將其編譯成機(jī)器碼。netCIL是一樣的,.net公共語言運(yùn)行時(shí)(CLR)對(duì)機(jī)器代碼使用即時(shí)編譯。

        那么,如果Python都使用虛擬機(jī)和某種字節(jié)碼,那么為什么在基準(zhǔn)測(cè)試中它比Java和c#慢那么多呢?

        首先,.net和Java是jit編譯的。JIT或即時(shí)編譯需要一種中間語言來允許將代碼分割成塊(或幀)。提前(AOT)編譯器的設(shè)計(jì)是為了確保CPU在進(jìn)行任何交互之前能夠理解代碼中的每一行。

        JIT本身并沒有使執(zhí)行變得更快,因?yàn)樗匀辉趫?zhí)行相同的字節(jié)碼序列。但是,JIT允許在運(yùn)行時(shí)進(jìn)行優(yōu)化。一個(gè)好的JIT優(yōu)化器會(huì)看到應(yīng)用程序的哪些部分被頻繁地執(zhí)行,稱之為“熱點(diǎn)”。然后,它將對(duì)這些代碼進(jìn)行優(yōu)化,用更高效的版本替換它們。

        這意味著當(dāng)您的應(yīng)用程序一次又一次地做同樣的事情時(shí),它可以顯著地更快。另外,請(qǐng)記住Java和c#是強(qiáng)類型語言,因此優(yōu)化器可以對(duì)代碼進(jìn)行更多的假設(shè)。

        PyPy有一個(gè)JIT,正如前一節(jié)所提到的,它比CPython要快得多。

        那么為什么CPython不使用JIT呢?

        jit也有缺點(diǎn):其中之一就是啟動(dòng)時(shí)間。CPython的啟動(dòng)時(shí)間已經(jīng)比較慢了,PyPy比CPython慢2-3倍。眾所周知,Java虛擬機(jī)的啟動(dòng)速度很慢。netCLR通過在系統(tǒng)啟動(dòng)時(shí)啟動(dòng)來解決這個(gè)問題,但是CLR的開發(fā)人員還開發(fā)運(yùn)行CLR的操作系統(tǒng)。

        如果您有一個(gè)運(yùn)行了很長時(shí)間的Python進(jìn)程,其中的代碼可以進(jìn)行優(yōu)化,因?yàn)樗盁狳c(diǎn)”,那么JIT就很有意義。

        然而,CPython是一種通用實(shí)現(xiàn)。因此,如果您正在使用Python開發(fā)命令行應(yīng)用程序,那么每次調(diào)用CLI時(shí)都必須等待JIT啟動(dòng),這將是非常慢的。

        CPython必須嘗試并服務(wù)盡可能多的用例。在CPython中插入JIT是有可能的,但是這個(gè)項(xiàng)目在很大程度上已經(jīng)停止了。如果您希望獲得JIT的好處,并且有適合它的工作負(fù)載,那么可以使用PyPy。

        3.因?yàn)樗莿?dòng)態(tài)類型語言

        態(tài)類型”語言中,必須在聲明變量時(shí)指定變量的類型。包括C,c++,Java,c#,Go。在動(dòng)態(tài)類型語言中,仍然有類型的概念,但是變量的類型是動(dòng)態(tài)的。

        在這個(gè)例子中,Python創(chuàng)建了第二個(gè)具有相同名稱和str類型的變量,并釋放為a的第一個(gè)實(shí)例創(chuàng)建的內(nèi)存

        靜態(tài)類型語言的設(shè)計(jì)并不是為了讓您的工作變得困難,而是因?yàn)镃PU的操作方式。如果最終需要將所有操作都等同于簡單的二進(jìn)制操作,則必須將對(duì)象和類型轉(zhuǎn)換為低級(jí)數(shù)據(jù)結(jié)構(gòu)。

        Python為您做了這些,您只是從來沒有見過它,也不需要關(guān)心它。

        不需要聲明類型并不是使Python變慢的原因,Python語言的設(shè)計(jì)使您能夠使幾乎任何東西都是動(dòng)態(tài)的。您可以在運(yùn)行時(shí)替換對(duì)象上的方法,您可以在運(yùn)行時(shí)對(duì)低級(jí)系統(tǒng)調(diào)用的值進(jìn)行monkey-patch。幾乎一切皆有可能。

        正是這種設(shè)計(jì)使得優(yōu)化Python變得非常困難。

        那么,Python的動(dòng)態(tài)類型會(huì)使它變慢嗎?

        比較和轉(zhuǎn)換類型的成本很高,每次讀取、寫入或引用某個(gè)變量時(shí),都要檢查該類型很難優(yōu)化一門如此動(dòng)態(tài)的語言。Python的許多替代品之所以如此之快,是因?yàn)樗鼈冊(cè)谛阅艿拿x下對(duì)靈活性做出了妥協(xié)看看Cython,它結(jié)合了C-Static類型和Python來優(yōu)化已知類型的代碼,可以提供84x的性能改進(jìn)。結(jié)論

        Python的主要缺點(diǎn)是它的動(dòng)態(tài)性和通用性。它可以作為解決各種問題的工具,在這些問題中,可能有更優(yōu)化、更快的替代方案。

        但是,可以通過利用異步、理解分析工具和考慮使用多解釋器來優(yōu)化Python應(yīng)用程序。

        對(duì)于啟動(dòng)時(shí)間不重要且代碼有利于JIT的應(yīng)用程序,可以考慮使用PyPy。

        對(duì)于您的代碼中性能非常重要并且有更多靜態(tài)類型變量的部分,可以考慮使用Cython。

        以上內(nèi)容為大家介紹了為什么python這么慢,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        Python標(biāo)準(zhǔn)庫主要有哪些功能?

        眾所周知,Python標(biāo)準(zhǔn)庫非常龐大,可以幫助處理各種各樣的工作,從而提高效率、節(jié)省成本。那么你對(duì)Python標(biāo)準(zhǔn)庫了解多少呢?你知道Python標(biāo)準(zhǔn)庫...詳情>>

        2023-11-05 23:38:38
        用Python編寫代碼時(shí)有哪些有用的技巧?

        不知道吧,使用Python編寫代碼時(shí),有一些小技巧可以大幅度提升我們的工作效率和開發(fā)效率,而且這些技巧很簡單,只需要在編寫代碼時(shí)稍微注意一下...詳情>>

        2023-11-05 22:48:14
        python基礎(chǔ)入門之設(shè)計(jì)URL方案

        DjangoURL分發(fā)系統(tǒng)使用了正則表達(dá)式配置模塊,它可以將URL字符串模式映射為Python方法views。這個(gè)系統(tǒng)允許URL與底層代碼完全脫節(jié),從而實(shí)現(xiàn)最大...詳情>>

        2023-11-05 22:37:26
        Python的編程語言

        一、Python編程語言的優(yōu)點(diǎn)有哪些?1.Python是一種腳本語言,寫好了就可以直接運(yùn)行,省去了編譯鏈接的麻煩,對(duì)于需要多動(dòng)手實(shí)踐的初學(xué)者而言,也...詳情>>

        2023-11-05 22:33:50
        python五大異常處理機(jī)制

        ??我們明白了什么是異常后,那么發(fā)現(xiàn)異常后怎么處理,便是我們接下來要解決的問題。這里將處理異常的方式總結(jié)為五種。1、默認(rèn)異常處理機(jī)制“...詳情>>

        2023-11-05 22:15:50
        泌阳县| 盐津县| 洛隆县| 城口县| 鞍山市| 金堂县| 石泉县| 清河县| 吴川市| 西峡县| 遂宁市| 许昌县| 湖南省| 上虞市| 吉木萨尔县| 周宁县| 海原县| 兰考县| 东宁县| 高平市| 奇台县| 马关县| 全椒县| 惠东县| 乡宁县| 宜春市| 海宁市| 沂源县| 廉江市| 保山市| 碌曲县| 鸡泽县| 溧水县| 共和县| 柳州市| 南部县| 潍坊市| 交口县| 罗江县| 密云县| 惠安县|