真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何用Python代碼將運行效率提升17倍

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何用Python代碼將運行效率提升17倍,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計的關(guān)注點不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)公司一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。

Mandelbrot集是一個涉及位運算、遞歸和虛數(shù)的有趣的數(shù)學現(xiàn)象。由于它是一個復(fù)雜且計算多樣化的函數(shù),對于如何提高代碼運行效率,是一個非常好的研究案例。

通過對函數(shù)mandelbrot_set函數(shù)進行運行計時,我們發(fā)現(xiàn)這個函數(shù)平均需要8秒鐘才能運行完成。

import numpy as np  def mandelbrot_set(width, height, zoom=1, x_off=0, y_off=0, niter=256):     w,h = width, height     pixels = np.arange(w*h, dtype=np.uint16).reshape(h, w)     for x in range(w):          for y in range(h):             zx = 1.5*(x + x_off - 3*w/4)/(0.5*zoom*w)             zy = 1.0*(y + y_off - h/2)/(0.5*zoom*h)             z = complex(zx, zy)             c = complex(0, 0)             for i in range(niter):                 if abs(c) > 4: break                 c = c**2 + z             color = (i << 21) + (i << 10)  + i * 8             pixels[y,x] = color

在代碼中加載Cython,效率提升25%

在這里,我們做一個簡單的更改:我們在一個單獨的單元中加載Cython,這是一個專用于在 C 和 Python  之間架起橋梁的轉(zhuǎn)換模塊。然后,在該單元格的頂部,鍵入 %% cython -a,觸發(fā) Jupyter Notebook 的換行符,通過 Cython  運行代碼,Cython 會在后臺自動將Python代碼轉(zhuǎn)換為C。我們的函數(shù) mandelbrot_set 可以在 Python  中調(diào)用,但將使用C結(jié)構(gòu)運行。

再次運行我們更新的代碼,我們看到減少了近兩秒。幾乎什么都不做就能提高25%的運行效率!

在函數(shù)中聲明變量類型,運行效率提升17倍

不過,我們還有更好的辦法。當 Cython 嘗試將 Python 進程轉(zhuǎn)換為 C 結(jié)構(gòu)時,它的運行速度就會受到限制。我們可以協(xié)助 Cython  加快運行的事情之一就是聲明在函數(shù)中使用的所有變量的變量類型,這樣可以更好地優(yōu)化我們的代碼。

注意每個參數(shù)的數(shù)據(jù)類型是如何指定的(在這種情況下,所有數(shù)據(jù)類型都為 int )。如果一個變量是獨立創(chuàng)建的,則可以使用 cdef  關(guān)鍵字,然后使用數(shù)據(jù)類型和采用該類型的變量。從直接聲明的變量到范圍(n)中的 i in 的所有內(nèi)容,都可以為 Cython 提供盡可能多的幫助。

重新運行使用了指定數(shù)據(jù)類型來進行更新后的函數(shù),我們發(fā)現(xiàn)運行時間減少了很多,比原來的時間快 了17倍!

在 10 秒鐘內(nèi),僅修改了一個數(shù)據(jù)類型,我們的代碼效率就提高了 17  倍。雖然減少的時間只有幾秒,但這種方法如果應(yīng)用于更長的代碼腳本中,節(jié)省的計算量那將是幾個小時。

工作原理

Cython是一個可以將 Python  編寫成更快、更高效的C語言的模塊。雖然Python的自由性和開放性促使了廣泛采用和開發(fā),特別是在數(shù)據(jù)科學和其他重計算領(lǐng)域,但這種自由是以效率低下為代價的。在C語言中,編碼者有義務(wù)提供有關(guān)代碼執(zhí)行的更多信息,這是一項可以加快處理速度的繁重工作。通過把我們的Python代碼寫成高效的  C 結(jié)構(gòu)和方法,你可以讓它變得更高效,而且你甚至不需要知道C是什么!

cdef 關(guān)鍵字將變量聲明為靜態(tài)類型的 C 變量。使用這些C變量可以更快地執(zhí)行代碼,因為變量本身具有指定的類型,而不是 Python  中具有類型的值。例如,在 Python 中,可以在一行中將相同的變量設(shè)置為整數(shù),而在另一行中將其設(shè)置為字符串。例如,a =“ hello  world”&a =1。但是,在 C 語言中,僅設(shè)置靜態(tài)類型的變量具有一種數(shù)據(jù)類型。

這種剛性意味著可以避免 Python  動態(tài)類型所需的巨大內(nèi)存空間開銷。因為一個變量可以具有許多可能的值,所以需要分配更多的內(nèi)存。另一方面,對靜態(tài)類型變量范圍的嚴格限制意味著內(nèi)存空間和執(zhí)行過程效率更高。如上所述,函數(shù)參數(shù)也可以聲明為靜態(tài)類型的C變量。

這就是為什么簡單地聲明變量類型會讓程序處理代碼的時間大大縮短。盡管還有許多其他方法可以使 Cython 更加高效地使用 Python  代碼,但最簡單,技術(shù)最少,回報最高的方法是寫出變量類型。

在你的腳本中有無數(shù)的Cython應(yīng)用程序。

下次如果你需要編寫逐行函數(shù)以應(yīng)用于具有數(shù)千行的數(shù)據(jù)幀,進行復(fù)雜的數(shù)據(jù)處理時,記得使用 Cython 來縮短遍歷所有行的時間。

如果你正在手寫數(shù)據(jù)轉(zhuǎn)換管道以應(yīng)用復(fù)雜和/或條件增強,也要記得考慮能否在 Cython 中實現(xiàn)。

在為神經(jīng)網(wǎng)絡(luò)編寫自定義優(yōu)化器或損失函數(shù)(或自我實現(xiàn)現(xiàn)有函數(shù))時,使用 Cython 可以加快訓練過程。

上述就是小編為大家分享的如何用Python代碼將運行效率提升17倍了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁名稱:如何用Python代碼將運行效率提升17倍
文章分享:http://weahome.cn/article/gggpch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部