自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

1個(gè)小技巧,讓你的Python代碼運(yùn)行效率提升17倍

開(kāi)發(fā) 前端
我們都希望自己的代碼更高效,花最少的精力,寫出最好性能的代碼,這也是本文的目的,希望文章中的這個(gè)技巧能幫助到大家。

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

 

1個(gè)小技巧,讓你的Python代碼運(yùn)行效率提升17倍

 

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

 

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

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

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

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

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

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

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

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

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

 

工作原理

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

cdef 關(guān)鍵字將變量聲明為靜態(tài)類型的 C 變量。使用這些C變量可以更快地執(zhí)行代碼,因?yàn)樽兞勘旧砭哂兄付ǖ念愋停皇?Python 中具有類型的值。例如,在 Python 中,可以在一行中將相同的變量設(shè)置為整數(shù),而在另一行中將其設(shè)置為字符串。例如,a =“ hello world”&a =1。但是,在 C 語(yǔ)言中,僅設(shè)置靜態(tài)類型的變量具有一種數(shù)據(jù)類型。

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

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

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

  • 下次如果你需要編寫逐行函數(shù)以應(yīng)用于具有數(shù)千行的數(shù)據(jù)幀,進(jìn)行復(fù)雜的數(shù)據(jù)處理時(shí),記得使用 Cython 來(lái)縮短遍歷所有行的時(shí)間。
  • 如果你正在手寫數(shù)據(jù)轉(zhuǎn)換管道以應(yīng)用復(fù)雜和/或條件增強(qiáng),也要記得考慮能否在 Cython 中實(shí)現(xiàn)。
  • 在為神經(jīng)網(wǎng)絡(luò)編寫自定義優(yōu)化器或損失函數(shù)(或自我實(shí)現(xiàn)現(xiàn)有函數(shù))時(shí),使用 Cython 可以加快訓(xùn)練過(guò)程。

 

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2021-02-05 16:20:54

代碼Linux技巧

2024-06-27 11:22:34

2019-08-23 19:22:31

SQL語(yǔ)句效率提升數(shù)據(jù)庫(kù)

2024-01-08 17:09:07

Python解釋器CPython

2022-01-06 22:31:21

Python技巧代碼

2020-04-20 17:43:28

Java代碼優(yōu)化開(kāi)發(fā)

2019-11-05 14:37:24

Java性能優(yōu)化編程語(yǔ)言

2019-11-25 10:20:54

CSS代碼javascript

2024-10-08 10:24:41

Python編程語(yǔ)言

2024-10-10 11:49:27

2023-06-13 13:52:00

Java 7線程池

2023-02-22 19:15:35

AI工具機(jī)器人

2019-05-10 14:50:09

Java代碼技巧

2016-10-09 20:07:43

2019-12-09 10:32:36

開(kāi)源技術(shù) 趨勢(shì)

2014-08-11 12:54:27

構(gòu)建模塊代碼審查編程

2023-05-31 07:24:48

2018-02-24 12:08:52

Python開(kāi)發(fā)技巧

2024-04-29 06:50:45

Python代碼運(yùn)行

2022-12-13 08:45:01

3F傾聽(tīng)模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)