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

Python代碼中偏函數(shù)的使用詳解

 更新時(shí)間:2023年12月22日 08:28:52   作者:DECHIN  
Python中的偏函數(shù)是來自函數(shù)式編程的一個(gè)強(qiáng)大工具,它的主要目標(biāo)是減少函數(shù)調(diào)用的復(fù)雜性,本文將詳細(xì)介紹偏函數(shù)的具體使用,需要的小伙伴可以了解下

技術(shù)背景

在數(shù)學(xué)中我們都學(xué)過偏導(dǎo)數(shù)∂f(x,y)/∂x,而這里我們提到的偏函數(shù),指的是f(y)(x)。也就是說,在代碼實(shí)現(xiàn)的過程中,雖然我們實(shí)現(xiàn)的一個(gè)函數(shù)可能帶有很多個(gè)變量,但是可以用偏函數(shù)的形式把其中一些不需要拆分和變化的變量轉(zhuǎn)變?yōu)楣逃凶兞?。比較典型的兩個(gè)例子是計(jì)算偏導(dǎo)數(shù)和多進(jìn)程優(yōu)化。雖然大部分支持自動(dòng)微分的框架都有相應(yīng)的支持偏導(dǎo)數(shù)的接口,多進(jìn)程操作中也可以指定額外的args,但是這些自帶的方法在形式上都是比較tricky的,感覺并不如使用偏函數(shù)優(yōu)雅和簡潔。這里我們主要介紹python中可能會(huì)用到的偏函數(shù)功能--partial。

Partial簡單案例

我們先來一個(gè)最簡單的乘法函數(shù)f(x,y)=xy。假如說我們想得到該函數(shù)關(guān)于y的偏導(dǎo)數(shù),注意,這里y是第二個(gè)輸入的變量,不是第一個(gè)位置,一般自動(dòng)微分框架都默認(rèn)都第一個(gè)位置的變量計(jì)算偏導(dǎo)數(shù)。相關(guān)代碼實(shí)現(xiàn)如下所示:

from functools import partial
 
def mul(x, y):
    print (locals())
    return x * y
 
x = 2
y = 3
res_0 = mul(x, y)
partial_mul = partial(mul, x=x)
res_1 = partial_mul(y=3)
print ('The result is: {}'.format(res_0))
print ('The result is: {}'.format(res_1))

這段代碼的運(yùn)行結(jié)果為:

{'x': 2, 'y': 3}
{'x': 2, 'y': 3}
The result is: 6
The result is: 6

我們現(xiàn)在來分析一下上面這個(gè)案例中所體現(xiàn)的信息:

  • 在使用partial函數(shù)時(shí)使用的是關(guān)鍵字參數(shù),即時(shí)原本的變量不是一個(gè)關(guān)鍵字參數(shù),而是一個(gè)位置參數(shù)。
  • 雖然得到的偏函數(shù)partial_mul運(yùn)行的方式跟函數(shù)一致,但其實(shí)它是一個(gè)partial的對象類型。
  • 在生成partial_mul對象時(shí)已經(jīng)執(zhí)行過一遍函數(shù),因此函數(shù)中的打印語句被打印了兩次。
  • 偏函數(shù)的計(jì)算結(jié)果肯定是跟原函數(shù)保持一致的,但是在一些特殊場景下,我們可能會(huì)用到這種單變量的偏函數(shù)。

Concurrent多核并行場景

現(xiàn)在我們稍微修改一下上面的案例,我們要用concurrent這個(gè)并行工具去分別執(zhí)行上述乘法任務(wù),同時(shí)輸入的x也變成了一個(gè)多維的數(shù)組。然后為了驗(yàn)證并行算法,這里每計(jì)算一次元素乘法,我們都用time.sleep方法讓進(jìn)程休眠2秒鐘時(shí)間。由于此時(shí)的參數(shù)y還是一個(gè)標(biāo)量,但是每次乘法計(jì)算我們都需要輸入這個(gè)標(biāo)量,因此我們直接將其封裝到一個(gè)partial偏函數(shù)中,使得函數(shù)變成:f(x,y)=f(y)(x)=P(x),然后對x這個(gè)入?yún)⑦M(jìn)行并行化操作:

import numpy as np
import concurrent.futures
from functools import partial
import time
# 定義休眠函數(shù)
def mul(x, y):
    time.sleep(2)
    return x * y
# 定義入?yún)?
x = np.array([1, 2, 3], np.float32)
y = 3.
# 有阻塞計(jì)算
time_0 = time.time()
res_0 = []
for _x in x:
    res_0.append(mul(_x, y))
res_0 = np.array(res_0, np.float32)
time_1 = time.time()
# 并行計(jì)算
partial_mul = partial(mul, y=y)
time_2 = time.time()
with concurrent.futures.ProcessPoolExecutor(max_workers=x.shape[0]) as executor:
    res = executor.map(partial_mul, x)
res_1 = np.array(list(res), np.float32)
time_3 = time.time()
print ('The result is: {}, and for loop time cost is: {}s'.format(res_0, time_1 - time_0))
print ('The result is: {}, and concurrent time cost is : {}s'.format(res_1, time_3 - time_2))

如果有感興趣的童鞋也可以去嘗試一下,在這種場景下的并行運(yùn)算,如果參量y不是一個(gè)可迭代式的變量,是無法用zip壓縮傳到map函數(shù)中去的。上述代碼的運(yùn)行結(jié)果如下:

The result is: [3. 6. 9.], and for loop time cost is: 6.005392789840698s
The result is: [3. 6. 9.], and concurrent time cost is : 2.0451698303222656s

這個(gè)計(jì)算時(shí)長其實(shí)就約等于休眠時(shí)長,因?yàn)檫@里我們開啟了3個(gè)進(jìn)程來進(jìn)行休眠,因此并行時(shí)長是2s。

Jax自動(dòng)微分場景

這里我們用Jax的自動(dòng)微分框架做一個(gè)示例,沒有安裝Jax和Jaxlib的想運(yùn)行需要自行安裝相關(guān)軟件。雖然在Jax的grad函數(shù)中,支持argnums這樣的參數(shù)配置,但從代碼層面角度來說,總是顯得可讀性并不好。正常情況下我們算偏導(dǎo)數(shù)∂f(x,y)/∂x其實(shí)更合理的表述應(yīng)該是∂P(x)/∂x。而如果按照J(rèn)ax這種寫法,更像是從[∂f(x,y)/∂x,∂f(x,y)/∂x]兩個(gè)元素中取了第一個(gè)元素。當(dāng)然,這只是表述上的問題,也是我個(gè)人的理解,其實(shí)并不影響程序的正確性。這里使用partial偏函數(shù)的相關(guān)案例如下所示:

from functools import partial
from jax import grad
from jax import numpy as jnp
# Jax要求grad函數(shù)輸出結(jié)果為標(biāo)量,所以要加一項(xiàng)求和
def mul(x, y):
    f = x * y
    return f.sum()
# 定義輸入變量
x = jnp.array([1, 2, 3], jnp.float32)
y = 3.
# 定義偏函數(shù)和對應(yīng)偏導(dǎo)數(shù)
partial_mul = partial(mul, y=y)
grad_mul = grad(partial_mul)
print (grad_mul(x))

執(zhí)行結(jié)果如下:

[3. 3. 3.]

總結(jié)概要

本文介紹了在Python中使用偏函數(shù)partial的方法,并且介紹了兩個(gè)使用partial函數(shù)的案例,分別是concurrent并行場景和基于jax的自動(dòng)微分場景。在這些相關(guān)的場景下,我們用partial函數(shù)更多時(shí)候可以使得代碼的可讀性更好,在性能上其實(shí)并沒有什么提升。如果不想使用partial函數(shù),類似的功能也可以使用參考鏈接中所介紹的方法,實(shí)現(xiàn)一個(gè)裝飾器,也可以做到一樣的功能。

到此這篇關(guān)于Python代碼中偏函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)Python偏函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)知識(shí)點(diǎn) 初識(shí)Python.md

    Python基礎(chǔ)知識(shí)點(diǎn) 初識(shí)Python.md

    在本篇文章中我們給大家總結(jié)了關(guān)于Python基礎(chǔ)知識(shí)點(diǎn),通過初識(shí)Python.md的相關(guān)內(nèi)容分享給Python初學(xué)者,一起來看下吧。
    2019-05-05
  • 在python中修改.properties文件的操作

    在python中修改.properties文件的操作

    這篇文章主要介紹了在python中修改.properties文件的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python使用pymongo庫操作MongoDB數(shù)據(jù)庫的方法實(shí)例

    Python使用pymongo庫操作MongoDB數(shù)據(jù)庫的方法實(shí)例

    今天小編就為大家分享一篇關(guān)于Python使用pymongo庫操作MongoDB數(shù)據(jù)庫的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python實(shí)現(xiàn)斗地主分牌洗牌

    python實(shí)現(xiàn)斗地主分牌洗牌

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)斗地主分牌洗牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • pytorch程序異常后刪除占用的顯存操作

    pytorch程序異常后刪除占用的顯存操作

    今天小編就為大家分享一篇pytorch程序異常后刪除占用的顯存操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • pytorch 中transforms的使用詳解

    pytorch 中transforms的使用詳解

    本文主要介紹了pytorch中transforms的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • exe反編譯為.py文件的方法

    exe反編譯為.py文件的方法

    本文主要介紹了exe反編譯為.py文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python利用scatter繪畫散點(diǎn)圖

    python利用scatter繪畫散點(diǎn)圖

    這篇文章主要介紹了python利用scatter繪畫散點(diǎn)圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-06-06
  • pandas實(shí)戰(zhàn):分析三國志人物示例實(shí)現(xiàn)

    pandas實(shí)戰(zhàn):分析三國志人物示例實(shí)現(xiàn)

    這篇文章主要介紹了pandas實(shí)戰(zhàn):分析三國志人物示例實(shí)現(xiàn),本文章內(nèi)容詳細(xì),具有很好的參考價(jià)值,希望對大家有所幫助,需要的朋友可以參考下
    2023-01-01
  • python實(shí)現(xiàn)的自動(dòng)發(fā)送消息功能詳解

    python實(shí)現(xiàn)的自動(dòng)發(fā)送消息功能詳解

    這篇文章主要介紹了python實(shí)現(xiàn)的自動(dòng)發(fā)送消息功能,涉及Python基于requests、itchat庫的數(shù)據(jù)請求與信息處理相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08

最新評論

乐至县| 大埔区| 南开区| 丘北县| 工布江达县| 临清市| 靖宇县| 深水埗区| 根河市| 定南县| 阳高县| 拉孜县| 安图县| 泽普县| 伊春市| 柞水县| 马边| 邵阳市| 文山县| 玉龙| 武功县| 南京市| 南城县| 南丰县| 珠海市| 成都市| 清新县| 曲松县| 扎赉特旗| 赤峰市| 通州市| 乌拉特后旗| 乐东| 米泉市| 志丹县| 营口市| 新竹县| 绥宁县| 华安县| 慈利县| 图们市|