欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

只需要這一行代碼就能讓python計(jì)算速度提高十倍

 更新時(shí)間:2021年05月24日 11:47:50   作者:BudingCode  
今天教大家一個(gè)小方法,只需要這一行代碼就能讓python計(jì)算速度提高十倍,文中介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)python的小伙伴有很好的幫助,需要的朋友可以參考下

一、前言

Python語(yǔ)言近年來(lái)人氣爆棚。它廣泛應(yīng)用于數(shù)據(jù)科學(xué),人工智能,以及網(wǎng)絡(luò)安全問(wèn)題中,由于代碼可讀性較強(qiáng),學(xué)習(xí)效率較高,吸引了許多非科班的同學(xué)進(jìn)行學(xué)習(xí)。然而,使用Python一段時(shí)間以后,發(fā)現(xiàn)它在速度上完全沒(méi)有優(yōu)勢(shì)可言,特別是計(jì)算密集型任務(wù)里,性能問(wèn)題一直是Python的軟肋。本文主要介紹了Python的JIT編譯器Numba,能夠在對(duì)代碼侵入最少的情況下,極大加速計(jì)算核心函數(shù)的運(yùn)行速度,適合數(shù)據(jù)分析業(yè)務(wù)相關(guān)的同學(xué)使用。

首先要回答這樣一個(gè)問(wèn)題:當(dāng)運(yùn)行同一個(gè)程序時(shí),為什么Python會(huì) 比其他語(yǔ)言慢2到10倍?為什么我們無(wú)法將它變得更快?

以下是最主要的原因:

  • “它是GIL(Global Interpreter Lock全局解釋器鎖)”
  • “它是解釋型語(yǔ)言而非編譯語(yǔ)言”
  • “它是動(dòng)態(tài)類型語(yǔ)言

由于本文的著重點(diǎn)并不是解釋Python速度慢的原因以及背后的邏輯,這部分就不深入探討了,歡迎有興趣的同學(xué)自行搜索🔍

二、Python的JIT編譯器

為了兼具移植性和性能,聰明的工程師們發(fā)明了 JIT 這個(gè)東西,所謂的 JIT 就是說(shuō)在解釋型語(yǔ)言中,對(duì)于經(jīng)常用到的或者說(shuō)有較大性能提升的代碼在解釋的時(shí)候編譯成機(jī)器碼,其他一次性或者說(shuō)沒(méi)有太大性能提升的代碼還是以字節(jié)碼的方式執(zhí)行。這樣的話,就能在保證移植性的同時(shí),又能讓性能提升一大截,

JIT編譯在代碼運(yùn)行時(shí)動(dòng)態(tài)將Python代碼編譯為機(jī)器代碼執(zhí)行,由于避免了Python內(nèi)置的解釋器,運(yùn)行速度會(huì)有很大提升。比較流行的JIT方案是Numba和Pypy,但由于Python的歷史包袱和語(yǔ)法變化等原因,沒(méi)有一個(gè)能夠完美實(shí)現(xiàn)的方案。方案各自存在不同的優(yōu)缺點(diǎn),需要在根據(jù)使用領(lǐng)域選擇合適的方案。

  • Pypy支持全局的加速,但對(duì)C庫(kù)支持不好,較為適合用于Web服務(wù)等事務(wù)型任務(wù)。
  • Numba能夠?qū)δ承┖瘮?shù)和庫(kù)進(jìn)行加速,高性能的同時(shí)保持了Python的兼容性,但使用的范圍會(huì)受到一定限制。

在這里插入圖片描述 

三、Numba快速學(xué)習(xí)

我們主要介紹Numba的基本用法,能夠在對(duì)代碼侵入最少的情況下,極大加速計(jì)算核心函數(shù)的運(yùn)行速度,適合數(shù)據(jù)分析業(yè)務(wù)相關(guān)的同學(xué)使用。

Numba通過(guò)使用LLVM技術(shù),將Python代碼編譯生成優(yōu)化后的機(jī)器碼,可以大幅提高代碼執(zhí)行效率。

對(duì)于Numba的學(xué)習(xí),紐約大學(xué)提供了一套入門級(jí)別的視頻,代碼簡(jiǎn)單,紐約大學(xué)Numba快速學(xué)習(xí),如果想要瀏覽中文文章歡迎繼續(xù)往下看!

關(guān)于安裝

首先是安裝numba,根據(jù)python環(huán)境,運(yùn)行不同的安裝命令:

conda install numba
pip install numba

四、關(guān)于使用

一句話總結(jié):使用Numba最簡(jiǎn)單的方式就是在函數(shù)定義前加@jit 或 @njit的裝飾即可。

Numba通過(guò)在函數(shù)定義前加decorator(修飾符)來(lái)申明是否進(jìn)行加速。如上文所說(shuō),最簡(jiǎn)單的使用方法是@jit。對(duì)于Numba的@jit有兩種編譯模式:nopython和object模式。

nopython模式會(huì)完全編譯這個(gè)被修飾的函數(shù),函數(shù)的運(yùn)行與Python解釋器完全無(wú)關(guān),不會(huì)調(diào)用Python的C語(yǔ)言API。如果想獲得最佳性能,推薦使用此種模式。同時(shí)由于@jit(nopython=True)太常用了,Numba提供了@njit修飾符,和這句話等價(jià),方便使用。但這種模式要求函數(shù)中所有變量的類型都可以被編譯器推導(dǎo)(一些基本類型,如不能是一些庫(kù)或自己定義的數(shù)據(jù)類型等),否則就會(huì)報(bào)錯(cuò)。

object模式中編譯器會(huì)自動(dòng)識(shí)別函數(shù)中循環(huán)語(yǔ)句等可以編譯加速的代碼部分,并編譯成機(jī)器碼,對(duì)于剩下不能識(shí)別的部分交給Python解釋器運(yùn)行。如果想獲取最佳性能,避免使用這種方法(For best performance avoid using this mode!)。

如果沒(méi)設(shè)置參數(shù)nopython=True,Numba首先會(huì)嘗試使用nopython模式,如果因?yàn)槟承┰驘o(wú)法使用,則會(huì)使用object模式。加了nopython后則會(huì)強(qiáng)制編譯器使用nopython模式,但如果代碼出現(xiàn)了不能自動(dòng)推導(dǎo)的類型,有報(bào)錯(cuò)的風(fēng)險(xiǎn)。

五、實(shí)驗(yàn)提升

from numba import jit
import random, time

def monte_carlo_pi(sam):
    account = 0
    for i in range(sam):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            account += 1
    return 4.0 * account / sam

@jit
def jit_monte_carlo_pi(sam):
    account = 0
    for i in range(sam):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            account += 1
    return 4.0 * account / sam

loops = [100000, 1000000, 10000000, 100000000, 1000000000]

for loop in loops:
	startTime = time.time()
	monte_carlo_pi(loop)
	t = time.time() - startTime
	print('python {} loop: {}'.format(loop, t))

	startTime = time.time()
	jit_monte_carlo_pi(loop)
	t = time.time() - startTime
	print('numba {} loop: {}'.format(loop, t))

對(duì)于以上代碼,運(yùn)行的結(jié)果是:
python 100000    loop: 0.0469999313354
numba  100000    loop: 0.213999986649
python 1000000   loop: 0.478999853134
numba  1000000   loop: 0.0110001564026
python 10000000  loop: 4.82499980927
numba  10000000  loop: 0.107000112534
python 100000000 loop: 48.728000164
numba  100000000 loop: 1.05900001526
python 1000000000 loop: 489.142100134
numba  1000000000 loop: 11.01402001452

可以看到,jit編譯后有約47倍的提升。循環(huán)次數(shù)越多,numba的加速效果就越明顯。對(duì)于更復(fù)雜的計(jì)算函數(shù),numba可能會(huì)有更好的效果。

到此這篇關(guān)于只需要這一行代碼就能讓python計(jì)算速度提高十倍的文章就介紹到這了,更多相關(guān)提高python計(jì)算速度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解使用python crontab設(shè)置linux定時(shí)任務(wù)

    詳解使用python crontab設(shè)置linux定時(shí)任務(wù)

    本篇文章主要介紹了使用python crontab設(shè)置linux定時(shí)任務(wù),具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • 基于Python創(chuàng)建可定制的HTTP服務(wù)器

    基于Python創(chuàng)建可定制的HTTP服務(wù)器

    這篇文章主要為大家演示一下如何使用?http.server?模塊來(lái)實(shí)現(xiàn)一個(gè)能夠發(fā)布網(wǎng)頁(yè)的應(yīng)用服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-05-05
  • Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    2019雙十一,tb推出了新的活動(dòng),商店喵幣,看了一下每天都有幾個(gè)任務(wù)來(lái)領(lǐng)取喵幣,從而升級(jí)店鋪賺錢,然而我既想賺紅包又不想干苦力,遂使用python來(lái)進(jìn)行手機(jī)自動(dòng)化操作,需要的朋友跟隨小編一起看看吧
    2019-10-10
  • python SVM 線性分類模型的實(shí)現(xiàn)

    python SVM 線性分類模型的實(shí)現(xiàn)

    這篇文章主要介紹了python SVM 線性分類模型的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python Metaclass原理與實(shí)現(xiàn)過(guò)程詳細(xì)講解

    Python Metaclass原理與實(shí)現(xiàn)過(guò)程詳細(xì)講解

    MetaClass元類,本質(zhì)也是一個(gè)類,但和普通類的用法不同,它可以對(duì)類內(nèi)部的定義(包括類屬性和類方法)進(jìn)行動(dòng)態(tài)的修改。可以這么說(shuō),使用元類的主要目的就是為了實(shí)現(xiàn)在創(chuàng)建類時(shí),能夠動(dòng)態(tài)地改變類中定義的屬性或者方法
    2022-11-11
  • Python collections模塊的使用技巧

    Python collections模塊的使用技巧

    Python的最大優(yōu)勢(shì)之一是其廣泛的模塊和軟件包。這將Python的功能擴(kuò)展到許多受歡迎的領(lǐng)域,包括機(jī)器學(xué)習(xí)、數(shù)據(jù)科學(xué)和Web開發(fā)等, 其中最好的模塊之一是Python的內(nèi)置collections 模塊。
    2021-04-04
  • python2.7 mayavi 安裝圖文教程(推薦)

    python2.7 mayavi 安裝圖文教程(推薦)

    下面小編就為大家?guī)?lái)一篇python2.7 mayavi 安裝圖文教程(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Python實(shí)現(xiàn)以主程序的形式執(zhí)行模塊

    Python實(shí)現(xiàn)以主程序的形式執(zhí)行模塊

    這篇文章主要介紹了Python實(shí)現(xiàn)以主程序的形式執(zhí)行模塊,首先創(chuàng)建一個(gè)以christmastree的命名的模塊并定義一個(gè)全局變量創(chuàng)建一個(gè)名稱為fun_christmastree()的函數(shù)展開詳情,感興趣的朋友可以參考一下
    2022-06-06
  • Python爬蟲 scrapy框架爬取某招聘網(wǎng)存入mongodb解析

    Python爬蟲 scrapy框架爬取某招聘網(wǎng)存入mongodb解析

    這篇文章主要介紹了Python爬蟲 scrapy框架爬取某招聘網(wǎng)存入mongodb解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • tensorflow使用指定gpu的方法

    tensorflow使用指定gpu的方法

    TensorFlow是一個(gè)基于數(shù)據(jù)流編程(dataflow programming)的符號(hào)數(shù)學(xué)系統(tǒng),被廣泛應(yīng)用于各類機(jī)器學(xué)習(xí),這篇文章主要介紹了tensorflow使用指定gpu的方法,需要的朋友可以參考下
    2020-02-02

最新評(píng)論