最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python代碼加速運(yùn)行的四種方法詳解

 更新時(shí)間:2025年06月20日 09:49:16   作者:鐘爍卓  
這篇文章主要為大家詳細(xì)介紹了python中代碼加速運(yùn)行的四種常見(jiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1.python執(zhí)行原理

python執(zhí)行過(guò)程:python腳本語(yǔ)言(.py)或者cython語(yǔ)言(.pyx)–解釋器解釋–>字節(jié)碼(.pyc)–虛擬機(jī)執(zhí)行–>機(jī)器碼(看不到,可以在cpu上跑起來(lái))。

由于沒(méi)有原生的編譯時(shí)類型檢查,所有的類型的檢查都被移交給了運(yùn)行時(shí),執(zhí)行一行Python代碼很可能需要做不只一行的類型檢查、邊界檢查,因此python比起C++等會(huì)慢很多。

python的解釋器可以多種,常見(jiàn)的是cpython(最常用)、Ipython(基于cpython的交互式解釋器)、pypy(動(dòng)圖編譯python代碼,運(yùn)行速度快,與cpython有少數(shù)不同)、Jython、IronPython。

2.Cypthon(推薦,速度與numba接近)

Cython是一門語(yǔ)言,文件名以.pyx結(jié)尾。其是python的超集,即兼容python,Cython與python類似于C++與C的關(guān)系。同時(shí)Cython也是一個(gè)編譯器的名稱,其可將Cython語(yǔ)言寫的pyx文件(包含.py文件)直接編譯成動(dòng)態(tài)庫(kù),從而獲得近乎于寫CXX語(yǔ)言的性能。

官網(wǎng)推薦使用setuptools (setup.py)的方法來(lái)編譯.pyx/.py代碼。如以下文件樹(shù),

├── os
│   └── ros_os.py
│   └── setup.py

目標(biāo)是將os文件夾下的ros_os.py編譯成.so動(dòng)態(tài)庫(kù),因此在ros_os.py同級(jí)目錄下新建一個(gè)setup.py文件。setup.py的內(nèi)容如下:

from setuptools import setup
from Cython.Build import cythonizesetup(
    name='ros_os',


    ext_modules=cythonize("ros_os.py"),
    zip_safe=False,
)

然后運(yùn)行指令python setup.py build_ext --inplace,則會(huì)在同級(jí)目錄下生成ros_os.so動(dòng)態(tài)庫(kù)文件。在其他python文件中,就可以通過(guò)import導(dǎo)入該.so文件,實(shí)現(xiàn)加速。

注意,若os文件夾下有__init__.py文件,則會(huì)出錯(cuò)。解決方法是需要將setup.py移動(dòng)到與ros_os.py最近的無(wú)__init__.py文件的文件夾下,如以下文件樹(shù)所示:

├── pkg
│   ├── init.py
│   ├── os
│   │   ├── init.py
│   │   └── ros_os.py
└── setup.py

os文件夾下有__init__.py文件,顯式地表示os是一個(gè)python的包,同樣地,pkg下也存在__init__.py文件,因此需要將setup.py放在與pkg同級(jí)的目錄下,該目錄是最靠近ros_os.py的最近的且無(wú)__init__.py文件的目錄。同時(shí),修改setup.py中對(duì)ros_os.py的路徑,如下:

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='ros_os',
    ext_modules=cythonize("pkg/os/ros_os.py"),
    zip_safe=False,
)

在setup.py的同級(jí)目錄下運(yùn)行編譯指令:python setup.py build_ext --inplace,則可以正確編譯獲得ros_os.so動(dòng)態(tài)文件。

優(yōu)點(diǎn):加速python,并達(dá)到python加密的效果(推薦的加密手段)

缺點(diǎn):需要手動(dòng)編譯;少數(shù)python內(nèi)置屬性不支持,例如__file__;

3.numba(傳言可加速40倍左右)

numba是一個(gè)可以加速python大部分模塊的庫(kù),其原理是將其修飾的函數(shù)在第一次運(yùn)行時(shí)先優(yōu)化并翻譯成機(jī)器碼,而在重復(fù)運(yùn)行時(shí),則直接調(diào)用該機(jī)器碼,因此達(dá)到可以媲美C和C++的速度。使用方法如下:

from numba import jit  # 從numba中導(dǎo)入函數(shù)jit
import random

@jit(nopython=True)   # jit,numba裝飾器中的一種
def monte_carlo_pi(nsamples):
    acc = 0
    for i in range(nsamples):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples

在原始代碼中加入第1行和第4行,則可以加速monte_carlo_pi模塊(自動(dòng)將其優(yōu)化并編譯成機(jī)器碼)。即,要加速哪個(gè)函數(shù),就在函數(shù)定義前面加上裝飾器@jit(nopython=True)。

優(yōu)點(diǎn):對(duì)numpy和循環(huán)語(yǔ)法的加速明顯;使用方便;

缺點(diǎn):少量庫(kù)無(wú)法加速,如pandas庫(kù);僅能安裝到無(wú)法用于python2及以下版本;安裝比較困難,需要裝llvm編譯器;

4.其他加速方法

使用整型代替浮點(diǎn)型

5.各自加速方法的對(duì)比

代碼片段對(duì)大小為128x128的二維數(shù)組求和,運(yùn)行1000次時(shí)間如下:

Total cost time for func: py_func, call 1000 times: 3.803216s. 
Total cost time for func: np_func, call 1000 times: 0.343562s. 
Total cost time for func: nb_func, call 1000 times: 0.017122s. 
Total cost time for func: cy_func, call 1000 times: 0.018159s.

它們分別代表了原始Python、Numpy、Numba、Cython對(duì)應(yīng)的性能??梢钥闯觯琧ython與numba可有效加速python代碼。其中,numba以稍微快于cython,但是numba不兼容python2,且調(diào)試?yán)щy,因此,推薦使用cython。

6.方法補(bǔ)充

下面小編為大家整理了一些其他Python可以加速運(yùn)行的技巧,希望對(duì)大家有所幫助

1.全面加速(pypy)

將python換為pypy,在純python代碼下,pypy的兼容性就不影響使用了,因?yàn)橐恍┘僷ython的代碼常常會(huì)用pypy進(jìn)行一下加速

測(cè)試代碼,for循環(huán)10000000次

start = time.time()
for i in range(10000000):
    print(i,end="\r")
end = time.time()
print(f"耗費(fèi)時(shí)間{end-start}秒>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")

2.if判斷靠前

如:

 if tag in ["nts", "nto", "ntc", "ntcb", "ntcf", "ntch", "nth", "ntu", "nt"]:
                                BMES(f_,i2, tag="ORG")
                            elif tag in ["nb", "nba", "nbc", "nbp", "nf", "nm", "nmc", "nhm", "nh"]:
                                BMES(f_,i2, tag="OBJ")
                            elif tag in ["nnd", "nnt", "nn"]:
                                BMES(f_,i2, tag="JOB")
                            elif tag in ["nr", "nrf"]:
                                BMES(f_,i2, tag="PER")
                            elif tag in ["t"]:
                                BMES(f_,i2, tag="TIME")
                            elif tag in ["ns", "nsf"]:
                                BMES(f_,i2, tag="LOC")
                            else:
                                for i3 in list(i2):
                                    f_.write(i3 + " " + f"O" + "\n")

滿足條件的可以先跳出判斷

到此這篇關(guān)于python代碼加速運(yùn)行的四種方法詳解的文章就介紹到這了,更多相關(guān)python加速運(yùn)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python極簡(jiǎn)代碼實(shí)現(xiàn)楊輝三角示例代碼

    Python極簡(jiǎn)代碼實(shí)現(xiàn)楊輝三角示例代碼

    楊輝三角形因?yàn)槠湫问胶?jiǎn)單,又有一定的使用價(jià)值,因此是入門編程題中被用的最多的,也是很好的語(yǔ)言實(shí)例標(biāo)的。這篇文章就給大家介紹了Python極簡(jiǎn)代碼實(shí)現(xiàn)楊輝三角的方法,文章給出了詳細(xì)的示例代碼和解釋,對(duì)大家理解很有幫助,感興趣的朋友們下面來(lái)一起看看吧。
    2016-11-11
  • 使用Python在Excel中實(shí)現(xiàn)自動(dòng)查找并替換數(shù)據(jù)

    使用Python在Excel中實(shí)現(xiàn)自動(dòng)查找并替換數(shù)據(jù)

    隨著項(xiàng)目的進(jìn)展,需要經(jīng)常在Excel業(yè)務(wù)表格中查找及替換數(shù)據(jù),已保證數(shù)據(jù)與實(shí)際項(xiàng)目進(jìn)度一致,手動(dòng)一個(gè)一個(gè)查找,然后替換,效率太低,還容易遺漏,現(xiàn)在我們來(lái)試試用Python自動(dòng)完成查找及替換吧,需要的朋友可以參考下
    2023-12-12
  • Python自動(dòng)生產(chǎn)表情包

    Python自動(dòng)生產(chǎn)表情包

    本文主要介紹了使用Python進(jìn)行簡(jiǎn)單圖像處理的方法以及Python自動(dòng)生產(chǎn)表情包的實(shí)例,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Python中執(zhí)行分位數(shù)回歸的示例詳解

    Python中執(zhí)行分位數(shù)回歸的示例詳解

    分位數(shù)回歸是線性回歸的擴(kuò)展版本,分位數(shù)回歸構(gòu)建一組變量(也稱為自變量)和分位數(shù)(也稱為因變量)之間的關(guān)系,下面我們就來(lái)看看Python如何執(zhí)行分位數(shù)回歸吧
    2024-03-03
  • python圖像處理之反色實(shí)現(xiàn)方法

    python圖像處理之反色實(shí)現(xiàn)方法

    這篇文章主要介紹了python圖像處理之反色實(shí)現(xiàn)方法,涉及Python結(jié)合OpenCV與numpy操作圖片的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Python?numpy中np.random.seed()的詳細(xì)用法實(shí)例

    Python?numpy中np.random.seed()的詳細(xì)用法實(shí)例

    在學(xué)習(xí)人工智能時(shí),大量的使用了np.random.seed(),利用隨機(jī)數(shù)種子,使得每次生成的隨機(jī)數(shù)相同,下面這篇文章主要給大家介紹了關(guān)于Python?numpy中np.random.seed()的詳細(xì)用法,需要的朋友可以參考下
    2022-08-08
  • Python中Unittest框架的具體使用

    Python中Unittest框架的具體使用

    這篇文章主要介紹了Python中Unittest框架的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python科學(xué)計(jì)算環(huán)境推薦——Anaconda

    Python科學(xué)計(jì)算環(huán)境推薦——Anaconda

    最近在用Python做中文自然語(yǔ)言處理。使用的IDE是PyCharm。PyCharm確實(shí)是Python開(kāi)發(fā)之首選,但用于科學(xué)計(jì)算方面,還略有欠缺。為此我嘗試過(guò)Enthought Canopy,但Canopy感覺(jué)把問(wèn)題搞得復(fù)雜化,管理Python擴(kuò)展也不太方便。直到今天我發(fā)現(xiàn)了 Anaconda 。
    2014-06-06
  • Python基于生成器迭代實(shí)現(xiàn)的八皇后問(wèn)題示例

    Python基于生成器迭代實(shí)現(xiàn)的八皇后問(wèn)題示例

    這篇文章主要介紹了Python基于生成器迭代實(shí)現(xiàn)的八皇后問(wèn)題,簡(jiǎn)單描述了八皇后問(wèn)題,并結(jié)合實(shí)例形式分析了Python基于生成器迭代解決八皇后問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • python實(shí)現(xiàn)從pdf文件中提取文本,并自動(dòng)翻譯的方法

    python實(shí)現(xiàn)從pdf文件中提取文本,并自動(dòng)翻譯的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)從pdf文件中提取文本,并自動(dòng)翻譯的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11

最新評(píng)論

汕头市| 霍城县| 乳源| 宁德市| 贵州省| 敦化市| 凤庆县| 鄂托克前旗| 克什克腾旗| 讷河市| 北辰区| 太康县| 亳州市| 将乐县| 镇赉县| 双峰县| 石嘴山市| 买车| 鄯善县| 文成县| 隆德县| 贵港市| 镇宁| 同江市| 墨竹工卡县| 宜州市| 景宁| 宝山区| 常德市| 浦县| 常德市| 泗水县| 托克托县| 重庆市| 孝感市| 铜山县| 新源县| 平罗县| 台山市| 利川市| 峨山|