㈠ 一篇文章帶你深度解析python線程和進程
使用Python中的線程模塊,能夠同時運行程序的不同部分,並簡化設計。如果你已經入門Python,並且想用線程來提升程序運行速度的話,希望這篇教程會對你有所幫助。
線程與進程
什麼是進程
進程是系統進行資源分配和調度的一個獨立單位 進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。每個進程都有自己的獨立內存空間,不同進程通過進程間通信來通信。由於進程比較重量,占據獨立的內存,所以上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,但相對比較穩定安全。
什麼是線程
CPU調度和分派的基本單位 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。線程間通信主要通過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。
進程與線程的關系圖
線程與進程的區別:
進程
現實生活中,有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛 汽車 ,比如唱歌跳舞也是同時進行的,再比如邊吃飯邊打電話;試想如果我們吃飯的時候有一個領導來電,我們肯定是立刻就接聽了。但是如果你吃完飯再接聽或者回電話,很可能會被開除。
注意:
多任務的概念
什麼叫 多任務 呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕作業,這就是多任務,至少同時有3個任務正在運行。還有很多任務悄悄地在後台同時運行著,只是桌面上沒有顯示而已。
現在,多核CPU已經非常普及了,但是,即使過去的單核CPU,也可以執行多任務。由於CPU執行代碼都是順序執行的,那麼,單核CPU是怎麼執行多任務的呢?
答案就是操作系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒,這樣反復執行下去。表面上看,每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
真正的並行執行多任務只能在多核CPU上實現,但是,由於任務數量遠遠多於CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行。 其實就是CPU執行速度太快啦!以至於我們感受不到在輪流調度。
並行與並發
並行(Parallelism)
並行:指兩個或兩個以上事件(或線程)在同一時刻發生,是真正意義上的不同事件或線程在同一時刻,在不同CPU資源呢上(多核),同時執行。
特點
並發(Concurrency)
指一個物理CPU(也可以多個物理CPU) 在若幹道程序(或線程)之間多路復用,並發性是對有限物理資源強制行使多用戶共享以提高效率。
特點
multiprocess.Process模塊
process模塊是一個創建進程的模塊,藉助這個模塊,就可以完成進程的創建。
語法:Process([group [, target [, name [, args [, kwargs]]]]])
由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動)。
注意:1. 必須使用關鍵字方式來指定參數;2. args指定的為傳給target函數的位置參數,是一個元祖形式,必須有逗號。
參數介紹:
group:參數未使用,默認值為None。
target:表示調用對象,即子進程要執行的任務。
args:表示調用的位置參數元祖。
kwargs:表示調用對象的字典。如kwargs = {'name':Jack, 'age':18}。
name:子進程名稱。
代碼:
除了上面這些開啟進程的方法之外,還有一種以繼承Process的方式開啟進程的方式:
通過上面的研究,我們千方百計實現了程序的非同步,讓多個任務可以同時在幾個進程中並發處理,他們之間的運行沒有順序,一旦開啟也不受我們控制。盡管並發編程讓我們能更加充分的利用IO資源,但是也給我們帶來了新的問題。
當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題,我們可以考慮加鎖,我們以模擬搶票為例,來看看數據安全的重要性。
加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串列的修改。加鎖犧牲了速度,但是卻保證了數據的安全。
因此我們最好找尋一種解決方案能夠兼顧:1、效率高(多個進程共享一塊內存的數據)2、幫我們處理好鎖問題。
mutiprocessing模塊為我們提供的基於消息的IPC通信機制:隊列和管道。隊列和管道都是將數據存放於內存中 隊列又是基於(管道+鎖)實現的,可以讓我們從復雜的鎖問題中解脫出來, 我們應該盡量避免使用共享數據,盡可能使用消息傳遞和隊列,避免處理復雜的同步和鎖問題,而且在進程數目增多時,往往可以獲得更好的可獲展性( 後續擴展該內容 )。
線程
Python的threading模塊
Python 供了幾個用於多線程編程的模塊,包括 thread, threading 和 Queue 等。thread 和 threading 模塊允許程序員創建和管理線程。thread 模塊 供了基本的線程和鎖的支持,而 threading 供了更高級別,功能更強的線程管理的功能。Queue 模塊允許用戶創建一個可以用於多個線程之間 共享數據的隊列數據結構。
python創建和執行線程
創建線程代碼
1. 創建方法一:
2. 創建方法二:
進程和線程都是實現多任務的一種方式,例如:在同一台計算機上能同時運行多個QQ(進程),一個QQ可以打開多個聊天窗口(線程)。資源共享:進程不能共享資源,而線程共享所在進程的地址空間和其他資源,同時,線程有自己的棧和棧指針。所以在一個進程內的所有線程共享全局變數,但多線程對全局變數的更改會導致變數值得混亂。
代碼演示:
得到的結果是:
首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標准,但是可以用不同的編譯器來編譯成可執行代碼。同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行(其中的JPython就沒有GIL)。
那麼CPython實現中的GIL又是什麼呢?GIL全稱Global Interpreter Lock為了避免誤導,我們還是來看一下官方給出的解釋:
主要意思為:
因此,解釋器實際上被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執行。在多線程環境中,Python 虛擬機按以下方式執行:
由於GIL的存在,Python的多線程不能稱之為嚴格的多線程。因為 多線程下每個線程在執行的過程中都需要先獲取GIL,保證同一時刻只有一個線程在運行。
由於GIL的存在,即使是多線程,事實上同一時刻只能保證一個線程在運行, 既然這樣多線程的運行效率不就和單線程一樣了嗎,那為什麼還要使用多線程呢?
由於以前的電腦基本都是單核CPU,多線程和單線程幾乎看不出差別,可是由於計算機的迅速發展,現在的電腦幾乎都是多核CPU了,最少也是兩個核心數的,這時差別就出來了:通過之前的案例我們已經知道,即使在多核CPU中,多線程同一時刻也只有一個線程在運行,這樣不僅不能利用多核CPU的優勢,反而由於每個線程在多個CPU上是交替執行的,導致在不同CPU上切換時造成資源的浪費,反而會更慢。即原因是一個進程只存在一把gil鎖,當在執行多個線程時,內部會爭搶gil鎖,這會造成當某一個線程沒有搶到鎖的時候會讓cpu等待,進而不能合理利用多核cpu資源。
但是在使用多線程抓取網頁內容時,遇到IO阻塞時,正在執行的線程會暫時釋放GIL鎖,這時其它線程會利用這個空隙時間,執行自己的代碼,因此多線程抓取比單線程抓取性能要好,所以我們還是要使用多線程的。
GIL對多線程Python程序的影響
程序的性能受到計算密集型(CPU)的程序限制和I/O密集型的程序限制影響,那什麼是計算密集型和I/O密集型程序呢?
計算密集型:要進行大量的數值計算,例如進行上億的數字計算、計算圓周率、對視頻進行高清解碼等等。這種計算密集型任務雖然也可以用多任務完成,但是花費的主要時間在任務切換的時間,此時CPU執行任務的效率比較低。
IO密集型:涉及到網路請求(time.sleep())、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。
當然為了避免GIL對我們程序產生影響,我們也可以使用,線程鎖。
Lock&RLock
常用的資源共享鎖機制:有Lock、RLock、Semphore、Condition等,簡單給大家分享下Lock和RLock。
Lock
特點就是執行速度慢,但是保證了數據的安全性
RLock
使用鎖代碼操作不當就會產生死鎖的情況。
什麼是死鎖
死鎖:當線程A持有獨占鎖a,並嘗試去獲取獨占鎖b的同時,線程B持有獨占鎖b,並嘗試獲取獨占鎖a的情況下,就會發生AB兩個線程由於互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖。即死鎖是指多個進程因競爭資源而造成的一種僵局,若無外力作用,這些進程都將無法向前推進。
所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配演算法,避免進程永久占據系統資源。
死鎖代碼
python線程間通信
如果各個線程之間各干各的,確實不需要通信,這樣的代碼也十分的簡單。但這一般是不可能的,至少線程要和主線程進行通信,不然計算結果等內容無法取回。而實際情況中要復雜的多,多個線程間需要交換數據,才能得到正確的執行結果。
python中Queue是消息隊列,提供線程間通信機制,python3中重名為為queue,queue模塊塊下提供了幾個阻塞隊列,這些隊列主要用於實現線程通信。
在 queue 模塊下主要提供了三個類,分別代表三種隊列,它們的主要區別就在於進隊列、出隊列的不同。
簡單代碼演示
此時代碼會阻塞,因為queue中內容已滿,此時可以在第四個queue.put('蘋果')後面添加timeout,則成為 queue.put('蘋果',timeout=1)如果等待1秒鍾仍然是滿的就會拋出異常,可以捕獲異常。
同理如果隊列是空的,無法獲取到內容默認也會阻塞,如果不阻塞可以使用queue.get_nowait()。
在掌握了 Queue 阻塞隊列的特性之後,在下面程序中就可以利用 Queue 來實現線程通信了。
下面演示一個生產者和一個消費者,當然都可以多個
使用queue模塊,可在線程間進行通信,並保證了線程安全。
協程
協程,又稱微線程,纖程。英文名Coroutine。
協程是python個中另外一種實現多任務的方式,只不過比線程更小佔用更小執行單元(理解為需要的資源)。為啥說它是一個執行單元,因為它自帶CPU上下文。這樣只要在合適的時機, 我們可以把一個協程 切換到另一個協程。只要這個過程中保存或恢復 CPU上下文那麼程序還是可以運行的。
通俗的理解:在一個線程中的某個函數,可以在任何地方保存當前函數的一些臨時變數等信息,然後切換到另外一個函數中執行,注意不是通過調用函數的方式做到的,並且切換的次數以及什麼時候再切換到原來的函數都由開發者自己確定。
在實現多任務時,線程切換從系統層面遠不止保存和恢復 CPU上下文這么簡單。操作系統為了程序運行的高效性每個線程都有自己緩存Cache等等數據,操作系統還會幫你做這些數據的恢復操作。所以線程的切換非常耗性能。但是協程的切換只是單純的操作CPU的上下文,所以一秒鍾切換個上百萬次系統都抗的住。
greenlet與gevent
為了更好使用協程來完成多任務,除了使用原生的yield完成模擬協程的工作,其實python還有的greenlet模塊和gevent模塊,使實現協程變的更加簡單高效。
greenlet雖說實現了協程,但需要我們手工切換,太麻煩了,gevent是比greenlet更強大的並且能夠自動切換任務的模塊。
其原理是當一個greenlet遇到IO(指的是input output 輸入輸出,比如網路、文件操作等)操作時,比如訪問網路,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。
模擬耗時操作:
如果有耗時操作也可以換成,gevent中自己實現的模塊,這時候就需要打補丁了。
使用協程完成一個簡單的二手房信息的爬蟲代碼吧!
以下文章來源於Python專欄 ,作者宋宋
文章鏈接:https://mp.weixin.qq.com/s/2r3_ipU3HjdA5VnqSHjUnQ
㈡ 萬字教你如何用 Python 實現線性規劃
想像一下,您有一個線性方程組和不等式系統。這樣的系統通常有許多可能的解決方案。線性規劃是一組數學和計算工具,可讓您找到該系統的特定解,該解對應於某些其他線性函數的最大值或最小值。
混合整數線性規劃是 線性規劃 的擴展。它處理至少一個變數採用離散整數而不是連續值的問題。盡管乍一看混合整數問題與連續變數問題相似,但它們在靈活性和精度方面具有顯著優勢。
整數變數對於正確表示自然用整數表示的數量很重要,例如生產的飛機數量或服務的客戶數量。
一種特別重要的整數變數是 二進制變數 。它只能取 零 或 一 的值,在做出是或否的決定時很有用,例如是否應該建造工廠或者是否應該打開或關閉機器。您還可以使用它們來模擬邏輯約束。
線性規劃是一種基本的優化技術,已在科學和數學密集型領域使用了數十年。它精確、相對快速,適用於一系列實際應用。
混合整數線性規劃允許您克服線性規劃的許多限制。您可以使用分段線性函數近似非線性函數、使用半連續變數、模型邏輯約束等。它是一種計算密集型工具,但計算機硬體和軟體的進步使其每天都更加適用。
通常,當人們試圖制定和解決優化問題時,第一個問題是他們是否可以應用線性規劃或混合整數線性規劃。
以下文章說明了線性規劃和混合整數線性規劃的一些用例:
隨著計算機能力的增強、演算法的改進以及更多用戶友好的軟體解決方案的出現,線性規劃,尤其是混合整數線性規劃的重要性隨著時間的推移而增加。
解決線性規劃問題的基本方法稱為,它有多種變體。另一種流行的方法是。
混合整數線性規劃問題可以通過更復雜且計算量更大的方法來解決,例如,它在幕後使用線性規劃。這種方法的一些變體是,它涉及使用 切割平面 ,以及。
有幾種適用於線性規劃和混合整數線性規劃的合適且眾所周知的 Python 工具。其中一些是開源的,而另一些是專有的。您是否需要免費或付費工具取決於問題的規模和復雜性,以及對速度和靈活性的需求。
值得一提的是,幾乎所有廣泛使用的線性規劃和混合整數線性規劃庫都是以 Fortran 或 C 或 C++ 原生和編寫的。這是因為線性規劃需要對(通常很大)矩陣進行計算密集型工作。此類庫稱為求解器。Python 工具只是求解器的包裝器。
Python 適合圍繞本機庫構建包裝器,因為它可以很好地與 C/C++ 配合使用。對於本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有關此酷功能的更多信息,請查看以下資源:
基本上,當您定義和求解模型時,您使用 Python 函數或方法調用低級庫,該庫執行實際優化工作並將解決方案返回給您的 Python 對象。
幾個免費的 Python 庫專門用於與線性或混合整數線性規劃求解器交互:
在本教程中,您將使用SciPy和PuLP來定義和解決線性規劃問題。
在本節中,您將看到線性規劃問題的兩個示例:
您將在下一節中使用 Python 來解決這兩個問題。
考慮以下線性規劃問題:
你需要找到X和Ÿ使得紅色,藍色和黃色的不平等,以及不平等X 0和ÿ 0,是滿意的。同時,您的解決方案必須對應於z的最大可能值。
您需要找到的自變數(在本例中為 x 和 y )稱為 決策變數 。要最大化或最小化的決策變數的函數(在本例中為 z) 稱為 目標函數 、 成本函數 或僅稱為 目標 。您需要滿足的 不等式 稱為 不等式約束 。您還可以在稱為 等式約束 的約束中使用方程。
這是您如何可視化問題的方法:
紅線代表的功能2 X + Ý = 20,和它上面的紅色區域示出了紅色不等式不滿足。同樣,藍線是函數 4 x + 5 y = 10,藍色區域被禁止,因為它違反了藍色不等式。黃線是 x + 2 y = 2,其下方的黃色區域是黃色不等式無效的地方。
如果您忽略紅色、藍色和黃色區域,則僅保留灰色區域。灰色區域的每個點都滿足所有約束,是問題的潛在解決方案。該區域稱為 可行域 ,其點為 可行解 。在這種情況下,有無數可行的解決方案。
您想最大化z。對應於最大z的可行解是 最優解 。如果您嘗試最小化目標函數,那麼最佳解決方案將對應於其可行的最小值。
請注意,z是線性的。你可以把它想像成一個三維空間中的平面。這就是為什麼最優解必須在可行區域的 頂點 或角上的原因。在這種情況下,最佳解決方案是紅線和藍線相交的點,稍後您將看到。
有時,可行區域的整個邊緣,甚至整個區域,都可以對應相同的z值。在這種情況下,您有許多最佳解決方案。
您現在已准備好使用綠色顯示的附加等式約束來擴展問題:
方程式 x + 5 y = 15,以綠色書寫,是新的。這是一個等式約束。您可以通過向上一張圖像添加相應的綠線來將其可視化:
現在的解決方案必須滿足綠色等式,因此可行區域不再是整個灰色區域。它是綠線從與藍線的交點到與紅線的交點穿過灰色區域的部分。後一點是解決方案。
如果插入x的所有值都必須是整數的要求,那麼就會得到一個混合整數線性規劃問題,可行解的集合又會發生變化:
您不再有綠線,只有沿線的x值為整數的點。可行解是灰色背景上的綠點,此時最優解離紅線最近。
這三個例子說明了 可行的線性規劃問題 ,因為它們具有有界可行區域和有限解。
如果沒有解,線性規劃問題是 不可行的 。當沒有解決方案可以同時滿足所有約束時,通常會發生這種情況。
例如,考慮如果添加約束x + y 1會發生什麼。那麼至少有一個決策變數(x或y)必須是負數。這與給定的約束x 0 和y 0相沖突。這樣的系統沒有可行的解決方案,因此稱為不可行的。
另一個示例是添加與綠線平行的第二個等式約束。這兩行沒有共同點,因此不會有滿足這兩個約束的解決方案。
一個線性規劃問題是 無界的 ,如果它的可行區域是無界,將溶液不是有限。這意味著您的變數中至少有一個不受約束,可以達到正無窮大或負無窮大,從而使目標也無限大。
例如,假設您採用上面的初始問題並刪除紅色和黃色約束。從問題中刪除約束稱為 放鬆 問題。在這種情況下,x和y不會在正側有界。您可以將它們增加到正無窮大,從而產生無限大的z值。
在前面的部分中,您研究了一個與任何實際應用程序無關的抽象線性規劃問題。在本小節中,您將找到與製造業資源分配相關的更具體和實用的優化問題。
假設一家工廠生產四種不同的產品,第一種產品的日產量為x ₁,第二種產品的產量為x 2,依此類推。目標是確定每種產品的利潤最大化日產量,同時牢記以下條件:
數學模型可以這樣定義:
目標函數(利潤)在條件 1 中定義。人力約束遵循條件 2。對原材料 A 和 B 的約束可以從條件 3 和條件 4 中通過對每種產品的原材料需求求和得出。
最後,產品數量不能為負,因此所有決策變數必須大於或等於零。
與前面的示例不同,您無法方便地將其可視化,因為它有四個決策變數。但是,無論問題的維度如何,原理都是相同的。
在本教程中,您將使用兩個Python 包來解決上述線性規劃問題:
SciPy 設置起來很簡單。安裝後,您將擁有開始所需的一切。它的子包 scipy.optimize 可用於線性和非線性優化。
PuLP 允許您選擇求解器並以更自然的方式表述問題。PuLP 使用的默認求解器是COIN-OR Branch and Cut Solver (CBC)。它連接到用於線性鬆弛的COIN-OR 線性規劃求解器 (CLP)和用於切割生成的COIN-OR 切割生成器庫 (CGL)。
另一個偉大的開源求解器是GNU 線性規劃工具包 (GLPK)。一些著名且非常強大的商業和專有解決方案是Gurobi、CPLEX和XPRESS。
除了在定義問題時提供靈活性和運行各種求解器的能力外,PuLP 使用起來不如 Pyomo 或 CVXOPT 等替代方案復雜,後者需要更多的時間和精力來掌握。
要學習本教程,您需要安裝 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。
您可以使用pip以下方法安裝兩者:
您可能需要運行pulptest或sudo pulptest啟用 PuLP 的默認求解器,尤其是在您使用 linux 或 Mac 時:
或者,您可以下載、安裝和使用 GLPK。它是免費和開源的,適用於 Windows、MacOS 和 Linux。在本教程的後面部分,您將看到如何將 GLPK(除了 CBC)與 PuLP 一起使用。
在 Windows 上,您可以下載檔案並運行安裝文件。
在 MacOS 上,您可以使用 Homebrew:
在 Debian 和 Ubuntu 上,使用apt來安裝glpk和glpk-utils:
在Fedora,使用dnf具有glpk-utils:
您可能還會發現conda對安裝 GLPK 很有用:
安裝完成後,可以查看GLPK的版本:
有關詳細信息,請參閱 GLPK 關於使用Windows 可執行文件和Linux 軟體包進行安裝的教程。
在本節中,您將學習如何使用 SciPy優化和求根庫進行線性規劃。
要使用 SciPy 定義和解決優化問題,您需要導入scipy.optimize.linprog():
現在您已經linprog()導入,您可以開始優化。
讓我們首先解決上面的線性規劃問題:
linprog()僅解決最小化(而非最大化)問題,並且不允許具有大於或等於符號 ( ) 的不等式約束。要解決這些問題,您需要在開始優化之前修改您的問題:
引入這些更改後,您將獲得一個新系統:
該系統與原始系統等效,並且將具有相同的解決方案。應用這些更改的唯一原因是克服 SciPy 與問題表述相關的局限性。
下一步是定義輸入值:
您將上述系統中的值放入適當的列表、元組或NumPy 數組中:
注意:請注意行和列的順序!
約束左側和右側的行順序必須相同。每一行代表一個約束。
來自目標函數和約束左側的系數的順序必須匹配。每列對應一個決策變數。
下一步是以與系數相同的順序定義每個變數的界限。在這種情況下,它們都在零和正無窮大之間:
此語句是多餘的,因為linprog()默認情況下採用這些邊界(零到正無窮大)。
註:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。
最後,是時候優化和解決您感興趣的問題了。你可以這樣做linprog():
參數c是指來自目標函數的系數。A_ub和b_ub分別與不等式約束左邊和右邊的系數有關。同樣,A_eq並b_eq參考等式約束。您可以使用bounds提供決策變數的下限和上限。
您可以使用該參數method來定義要使用的線性規劃方法。有以下三種選擇:
linprog() 返回具有以下屬性的數據結構:
您可以分別訪問這些值:
這就是您獲得優化結果的方式。您還可以以圖形方式顯示它們:
如前所述,線性規劃問題的最優解位於可行區域的頂點。在這種情況下,可行區域只是藍線和紅線之間的綠線部分。最優解是代表綠線和紅線交點的綠色方塊。
如果要排除相等(綠色)約束,只需刪除參數A_eq並b_eq從linprog()調用中刪除:
解決方案與前一種情況不同。你可以在圖表上看到:
在這個例子中,最優解是紅色和藍色約束相交的可行(灰色)區域的紫色頂點。其他頂點,如黃色頂點,具有更高的目標函數值。
您可以使用 SciPy 來解決前面部分所述的資源分配問題:
和前面的例子一樣,你需要從上面的問題中提取必要的向量和矩陣,將它們作為參數傳遞給.linprog(),然後得到結果:
結果告訴您最大利潤是1900並且對應於x ₁ = 5 和x ₃ = 45。在給定條件下生產第二和第四個產品是沒有利潤的。您可以在這里得出幾個有趣的結論:
opt.statusis0和opt.successis True,說明優化問題成功求解,最優可行解。
SciPy 的線性規劃功能主要用於較小的問題。對於更大和更復雜的問題,您可能會發現其他庫更適合,原因如下:
幸運的是,Python 生態系統為線性編程提供了幾種替代解決方案,這些解決方案對於更大的問題非常有用。其中之一是 PuLP,您將在下一節中看到它的實際應用。
PuLP 具有比 SciPy 更方便的線性編程 API。您不必在數學上修改您的問題或使用向量和矩陣。一切都更干凈,更不容易出錯。
像往常一樣,您首先導入您需要的內容:
現在您已經導入了 PuLP,您可以解決您的問題。
您現在將使用 PuLP 解決此系統:
第一步是初始化一個實例LpProblem來表示你的模型:
您可以使用該sense參數來選擇是執行最小化(LpMinimize或1,這是默認值)還是最大化(LpMaximize或-1)。這個選擇會影響你的問題的結果。
一旦有了模型,就可以將決策變數定義為LpVariable類的實例:
您需要提供下限,lowBound=0因為默認值為負無窮大。該參數upBound定義了上限,但您可以在此處省略它,因為它默認為正無窮大。
可選參數cat定義決策變數的類別。如果您使用的是連續變數,則可以使用默認值"Continuous"。
您可以使用變數x和y創建表示線性表達式和約束的其他 PuLP 對象:
當您將決策變數與標量相乘或構建多個決策變數的線性組合時,您會得到一個pulp.LpAffineExpression代表線性表達式的實例。
注意:您可以增加或減少變數或表達式,你可以乘他們常數,因為紙漿類實現一些Python的特殊方法,即模擬數字類型一樣__add__(),__sub__()和__mul__()。這些方法用於像定製運營商的行為+,-和*。
類似地,您可以將線性表達式、變數和標量與運算符 ==、=以獲取表示模型線性約束的紙漿.LpConstraint實例。
註:也有可能與豐富的比較方法來構建的約束.__eq__(),.__le__()以及.__ge__()定義了運營商的行為==,=。
考慮到這一點,下一步是創建約束和目標函數並將它們分配給您的模型。您不需要創建列表或矩陣。只需編寫 Python 表達式並使用+=運算符將它們附加到模型中:
在上面的代碼中,您定義了包含約束及其名稱的元組。LpProblem允許您通過將約束指定為元組來向模型添加約束。第一個元素是一個LpConstraint實例。第二個元素是該約束的可讀名稱。
設置目標函數非常相似:
或者,您可以使用更短的符號:
現在您已經添加了目標函數並定義了模型。
注意:您可以使用運算符將 約束或目標附加到模型中,+=因為它的類LpProblem實現了特殊方法.__iadd__(),該方法用於指定 的行為+=。
對於較大的問題,lpSum()與列表或其他序列一起使用通常比重復+運算符更方便。例如,您可以使用以下語句將目標函數添加到模型中:
它產生與前一條語句相同的結果。
您現在可以看到此模型的完整定義:
模型的字元串表示包含所有相關數據:變數、約束、目標及其名稱。
注意:字元串表示是通過定義特殊方法構建的.__repr__()。有關 的更多詳細信息.__repr__(),請查看Pythonic OOP 字元串轉換:__repr__vs__str__ .
最後,您已准備好解決問題。你可以通過調用.solve()你的模型對象來做到這一點。如果要使用默認求解器 (CBC),則不需要傳遞任何參數:
.solve()調用底層求解器,修改model對象,並返回解決方案的整數狀態,1如果找到了最優解。有關其餘狀態代碼,請參閱LpStatus[]。
你可以得到優化結果作為 的屬性model。該函數value()和相應的方法.value()返回屬性的實際值:
model.objective持有目標函數model.constraints的值,包含鬆弛變數的值,以及對象x和y具有決策變數的最優值。model.variables()返回一個包含決策變數的列表:
如您所見,此列表包含使用 的構造函數創建的確切對象LpVariable。
結果與您使用 SciPy 獲得的結果大致相同。
注意:注意這個方法.solve()——它會改變對象的狀態,x並且y!
您可以通過調用查看使用了哪個求解器.solver:
輸出通知您求解器是 CBC。您沒有指定求解器,因此 PuLP 調用了默認求解器。
如果要運行不同的求解器,則可以將其指定為 的參數.solve()。例如,如果您想使用 GLPK 並且已經安裝了它,那麼您可以solver=GLPK(msg=False)在最後一行使用。請記住,您還需要導入它:
現在你已經導入了 GLPK,你可以在裡面使用它.solve():
該msg參數用於顯示來自求解器的信息。msg=False禁用顯示此信息。如果要包含信息,則只需省略msg或設置msg=True。
您的模型已定義並求解,因此您可以按照與前一種情況相同的方式檢查結果:
使用 GLPK 得到的結果與使用 SciPy 和 CBC 得到的結果幾乎相同。
一起來看看這次用的是哪個求解器:
正如您在上面用突出顯示的語句定義的那樣model.solve(solver=GLPK(msg=False)),求解器是 GLPK。
您還可以使用 PuLP 來解決混合整數線性規劃問題。要定義整數或二進制變數,只需傳遞cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不變:
在本例中,您有一個整數變數並獲得與之前不同的結果:
Nowx是一個整數,如模型中所指定。(從技術上講,它保存一個小數點後為零的浮點值。)這一事實改變了整個解決方案。讓我們在圖表上展示這一點:
如您所見,最佳解決方案是灰色背景上最右邊的綠點。這是兩者的最大價值的可行的解決方案x和y,給它的最大目標函數值。
GLPK 也能夠解決此類問題。
現在你可以使用 PuLP 來解決上面的資源分配問題:
定義和解決問題的方法與前面的示例相同:
在這種情況下,您使用字典 x來存儲所有決策變數。這種方法很方便,因為字典可以將決策變數的名稱或索引存儲為鍵,將相應的LpVariable對象存儲為值。列表或元組的LpVariable實例可以是有用的。
上面的代碼產生以下結果:
如您所見,該解決方案與使用 SciPy 獲得的解決方案一致。最有利可圖的解決方案是每天生產5.0第一件產品和45.0第三件產品。
讓我們把這個問題變得更復雜和有趣。假設由於機器問題,工廠無法同時生產第一種和第三種產品。在這種情況下,最有利可圖的解決方案是什麼?
現在您有另一個邏輯約束:如果x ₁ 為正數,則x ₃ 必須為零,反之亦然。這是二元決策變數非常有用的地方。您將使用兩個二元決策變數y ₁ 和y ₃,它們將表示是否生成了第一個或第三個產品:
除了突出顯示的行之外,代碼與前面的示例非常相似。以下是差異:
這是解決方案:
事實證明,最佳方法是排除第一種產品而只生產第三種產品。
就像有許多資源可以幫助您學習線性規劃和混合整數線性規劃一樣,還有許多具有 Python 包裝器的求解器可用。這是部分列表:
其中一些庫,如 Gurobi,包括他們自己的 Python 包裝器。其他人使用外部包裝器。例如,您看到可以使用 PuLP 訪問 CBC 和 GLPK。
您現在知道什麼是線性規劃以及如何使用 Python 解決線性規劃問題。您還了解到 Python 線性編程庫只是本機求解器的包裝器。當求解器完成其工作時,包裝器返回解決方案狀態、決策變數值、鬆弛變數、目標函數等。
㈢ Python中的鎖都具有哪些
大致羅列一下:
一、全局解釋器鎖(GIL)
1、什麼是全局解釋器鎖
每個CPU在同一時間只能執行一個線程,那麼其他的線程就必須等待該線程的全局解釋器,使用權消失後才能使用全局解釋器,即使多個線程直接不會相互影響在同一個進程下也只有一個線程使用cpu,這樣的機制稱為全局解釋器鎖(GIL)。GIL的設計簡化了CPython的實現,使的對象模型包括關鍵的內建類型,如:字典等,都是隱含的,可以並發訪問的,鎖住全局解釋器使得比較容易的實現對多線程的支持,但也損失了多處理器主機的並行計算能力。
2、全局解釋器鎖的好處
1)、避免了大量的加鎖解鎖的好處
2)、使數據更加安全,解決多線程間的數據完整性和狀態同步
3、全局解釋器的缺點
多核處理器退化成單核處理器,只能並發不能並行。
4、GIL的作用:
多線程情況下必須存在資源的競爭,GIL是為了保證在解釋器級別的線程唯一使用共享資源(cpu)。
二、同步鎖
1、什麼是同步鎖?
同一時刻的一個進程下的一個線程只能使用一個cpu,要確保這個線程下的程序在一段時間內被cpu執,那麼就要用到同步鎖。
2、為什麼用同步鎖?
因為有可能當一個線程在使用cpu時,該線程下的程序可能會遇到io操作,那麼cpu就會切到別的線程上去,這樣就有可能會影響到該程序結果的完整性。
3、怎麼使用同步鎖?
只需要在對公共數據的操作前後加上上鎖和釋放鎖的操作即可。
4、同步鎖的所用:
為了保證解釋器級別下的自己編寫的程序唯一使用共享資源產生了同步鎖。
三、死鎖
1、什麼是死鎖?
指兩個或兩個以上的線程或進程在執行程序的過程中,因爭奪資源或者程序推進順序不當而相互等待的一個現象。
2、死鎖產生的必要條件?
互斥條件、請求和保持條件、不剝奪條件、環路等待條件
3、處理死鎖的基本方法?
預防死鎖、避免死鎖(銀行家演算法)、檢測死鎖(資源分配)、解除死鎖:剝奪資源、撤銷進程
四、遞歸鎖
在Python中為了支持同一個線程中多次請求同一資源,Python提供了可重入鎖。這個RLock內部維護著一個Lock和一個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。遞歸鎖分為可遞歸鎖與非遞歸鎖。
五、樂觀鎖
假設不會發生並發沖突,只在提交操作時檢查是否違反數據完整性。
六、悲觀鎖
假定會發生並發沖突,屏蔽一切可能違反數據完整性的操作。
python常用的加鎖方式:互斥鎖、可重入鎖、迭代死鎖、互相調用死鎖、自旋鎖大致羅列一下:
一、全局解釋器鎖(GIL)
1、什麼是全局解釋器鎖
每個CPU在同一時間只能執行一個線程,那麼其他的線程就必須等待該線程的全局解釋器,使用權消失後才能使用全局解釋器,即使多個線程直接不會相互影響在同一個進程下也只有一個線程使用cpu,這樣的機制稱為全局解釋器鎖(GIL)。GIL的設計簡化了CPython的實現,使的對象模型包括關鍵的內建類型,如:字典等,都是隱含的,可以並發訪問的,鎖住全局解釋器使得比較容易的實現對多線程的支持,但也損失了多處理器主機的並行計算能力。
2、全局解釋器鎖的好處
1)、避免了大量的加鎖解鎖的好處
2)、使數據更加安全,解決多線程間的數據完整性和狀態同步
3、全局解釋器的缺點
多核處理器退化成單核處理器,只能並發不能並行。
4、GIL的作用:
多線程情況下必須存在資源的競爭,GIL是為了保證在解釋器級別的線程唯一使用共享資源(cpu)。
二、同步鎖
1、什麼是同步鎖?
同一時刻的一個進程下的一個線程只能使用一個cpu,要確保這個線程下的程序在一段時間內被cpu執,那麼就要用到同步鎖。
2、為什麼用同步鎖?
因為有可能當一個線程在使用cpu時,該線程下的程序可能會遇到io操作,那麼cpu就會切到別的線程上去,這樣就有可能會影響到該程序結果的完整性。
3、怎麼使用同步鎖?
只需要在對公共數據的操作前後加上上鎖和釋放鎖的操作即可。
4、同步鎖的所用:
為了保證解釋器級別下的自己編寫的程序唯一使用共享資源產生了同步鎖。
三、死鎖
1、什麼是死鎖?
指兩個或兩個以上的線程或進程在執行程序的過程中,因爭奪資源或者程序推進順序不當而相互等待的一個現象。
2、死鎖產生的必要條件?
互斥條件、請求和保持條件、不剝奪條件、環路等待條件
3、處理死鎖的基本方法?
預防死鎖、避免死鎖(銀行家演算法)、檢測死鎖(資源分配)、解除死鎖:剝奪資源、撤銷進程
四、遞歸鎖
在Python中為了支持同一個線程中多次請求同一資源,Python提供了可重入鎖。這個RLock內部維護著一個Lock和一個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。遞歸鎖分為可遞歸鎖與非遞歸鎖。
五、樂觀鎖
假設不會發生並發沖突,只在提交操作時檢查是否違反數據完整性。
六、悲觀鎖
假定會發生並發沖突,屏蔽一切可能違反數據完整性的操作。
python常用的加鎖方式:互斥鎖、可重入鎖、迭代死鎖、互相調用死鎖、自旋鎖
㈣ Python能幹什麼,Python的應用領%
Python主要的五大應用介紹:
一、Web開發
Python的誕生歷史比Web還要早,由於Python是一種解釋型的腳本語言,開發效率高,所以非常適合用來做Web開發。
Python有上百種Web開發框架,有很多成熟的模板技術,選擇Python開發Web應用,不但開發效率高,而且運行速度快。
二、網路爬蟲
網路爬蟲是Python比較常用的一個場景,國際上google在早期大量地使用Python語言作為網路爬蟲的基礎,帶動了整個Python語言的應用發展。
如:從各大網站爬取商品折扣信息,比較獲取最優選擇;對社交網路上發言進行收集分類,生成情緒地圖,分析語言習慣;爬取網易雲音樂某一類歌曲的所有評論,生成詞雲;應用實在太多,幾乎每個人學習爬蟲之後都能夠通過爬蟲去做一些好玩有趣有用的事。
三、人工智慧
人工智慧的核心演算法大部分還是依賴於C/C++的,因為是計算密集型,需要非常精細的優化,還需要GPU、專用硬體之類的介面,這些都只有C/C++能做到。
而Python是這些庫的API binding,使用Python是因為CPython的膠水語言特性,要開發一個其他語言到C/C++的跨語言介面,Python是最容易得,比其他語言的門檻要低不少,尤其是使用Cython的時候。
四、數據分析
數據分析處理方面,Python有很完備的生態環境。「大數據」分析中涉及到的分布式計算、數據可視化、資料庫操作等,Python中都有成熟的模塊可以選擇完成其功能。對於Hadoop-MapRece和Spark,都可以直接使用Python完成計算邏輯,這無論對於數據科學家還是對於數據工程師而言都是十分便利的。
五、自動化運維
Python對於伺服器運維而言也有十分重要的用途。由於目前幾乎所有Linux發行版中都自帶了Python解釋器,使用Python腳本進行批量化的文件部署和運行調整都成了Linux伺服器上很不錯的選擇。
㈤ 為什麼人工智慧用Python
這屬於一種誤解,人工智慧的核心演算法是完全依賴於C/C++的,因為是計算密集型,需要非常精細的優化,還需要GPU、專用硬體之類的介面,這些都只有C/C++能做到。所以某種意義上其實C/C++才是人工智慧領域最重要的語言。
Python是這些庫的API binding,使用Python是因為CPython的膠水語言特性,要開發一個其他語言到C/C++的跨語言介面,Python是最容易的,比其他語言的ffi門檻要低不少,尤其是使用Cython的時候。其他語言的ffi許多都只能導入C的函數入口點,復雜的數據結構大多隻能手工用byte數組拼起來,如果還需要回調函數輸入那就無計可施了。而CPython的C API是雙向融合的,可以直接對外暴露封裝過的Python對象,還可以允許用戶通過繼承這些自定義對象來引入新特性,甚至可以從C代碼當中再調用Python的函數(當然,也有一定的條件限制)。不過這也是PyPy這樣的JIT解釋器的一個障礙。
而且Python歷史上也一直都是科學計算和數據分析的重要工具,有numpy這樣的底子,因為行業近似所以選擇API binding語言的時候會首選Python,同時復用numpy這樣的基礎庫既減少了開發工作量,也方便從業人員上手。
㈥ python和人工智慧一樣嗎
提到人工智慧就一定會提到Python,有的初學者甚至認為人工智慧和Python是劃等號的。其實Python是一種計算機程序設計語言。是一種動態的、面向對象的腳本語言,開始時是用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。而人工智慧通俗講就是人為的通過嵌入式技術把程序寫入機器中使其實現智能化。顯然人工智慧和Python是兩個不同的概念。
人工智慧和Python的淵源在於就像我們統計數據或選擇用excel製作表格時,因為在需要用到加減乘除或者、函數等時,只需要套用公司就可以。因為SUM、AVERAGE等這樣的函數運行的背後,是C++/C#等語言已經編寫好了代碼,所以Excel只是工具和展現形式並不是它做計算。同理在學習人工智慧時Python只是用來操作深度學習框架的工具,實際負責運算的主要模塊並不依靠Python,真正起作用的是也是一大堆復雜的C++ / CUDA程序。
深度學習人工智慧時,自己計算太復雜,還要寫C++代碼操作,這時程序員就想要不搞一套類似復雜的Excel配置表,直接搭建神經網路、填參數、導入數據,一點按鈕就直接開始訓練模型、得出結果。這個方法簡單實用可是神經網路搭建起來太復雜,需要填寫的參數太多,各種五花八門的選項也很難做成直觀的圖形工具。只能用一個類似Python的相對好用的語言,通過簡化的程序代碼來搭建神經網路、填寫參數、導入數據,並調用執行函數進行訓練。通過這種語言來描述模型、傳遞參數、轉換好輸入數據,然後扔到復雜的深度學習框架裡面去計算。那麼為什麼會選擇Python?
科學家們很早就喜歡用Python實驗演算法,也善於使用numpy做科學計算,用pyplot畫數據圖。恰好Google內部用Python也非常多,所以採用Python也是必然的。除Python外,實際上TensorFlow框架還支持javaScript、c++、Java、GO、等語言。按說人工智慧演算法用這些也可以。但是官方說了,除Python之外的語言不一定承諾API穩定性。所以人工智慧和Python就密不可分了。
單說人工智慧的核心演算法,那是是完全依賴於C/C++的,因為是計算密集型,需要非常精細的優化,還需要GPU、專用硬體之類的介面,這些都只有C/C++能做到。所以某種意義上其實C/C++才是人工智慧領域最重要的語言。Python是這些庫的API binding,要開發一個其他語言到C/C++的跨語言介面,Python是最容易的,比其他語言的ffi門檻要低不少,CPython的C API是雙向融合的,可以直接對外暴露封裝過的Python對象,還可以允許用戶通過繼承這些自定義對象來引入新特性,甚至可以從C代碼當中再調用Python的函數。
Python一直都是科學計算和數據分析的重要工具。Python是這些庫的API binding,要開發一個其他語言到C/C++的跨語言介面。Python是最容易的,比其他語言的ffi門檻要低不少,CPython的C API是雙向融合的。可以直接對外暴露封裝過的Python對象,還可以允許用戶通過繼承這些自定義對象來引入新特性,甚至可以從C代碼當中再調用Python的函數。都說時勢造英雄,也可以說是人工智慧和Python互相之間成就者對方,人工智慧演算法促進Python的發展,而Python也讓演算法更加簡單。
㈦ 學python用來干什麼
學python可從事的職業就很多。
python是一門語法優美的編程語言,不僅可以作為小工具使用提升我們日常工作效率,也可以單獨作為一項高新就業技能!所以學完Python編程之後,只要真的掌握了相關技術,想要找到好的工作還是比較容易的。
學完Python編程之後可以做的工作:
軟體開發,用python做軟體是很多人正在從事的工作,不管是B/S軟體,還是C/S軟體,都能做。並且需求量還是挺大的;
數據挖掘,python可以製作出色的爬蟲工具來進行數據挖掘,而在很多的網路公司中數據挖掘的崗位也不少;
游戲開發,python擴展性很好,擁有游戲開發的庫,而且游戲開發絕對是暴力職業;
大數據分析,如今是大數據的時代,用python做大數據也是可以的,大數據分析工程師也是炙手可熱的職位;
全棧工程師,如今程序員都在向著全棧的方向發展,而學習python更具備這方面的優勢;
系統運維,python在很多linux中都支持,而且語法特點很向shell腳本,學完python做個系統運維也是很不錯的。
互聯網行業目前還是最熱門的行業之一,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。
想要系統學習,你可以考察對比一下開設有相關專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,能夠在校期間取得大專或本科學歷,中博軟體學院、南京課工場、南京北大青鳥等開設相關專業的學校都是不錯的,建議實地考察對比一下。
祝你學有所成,望採納。
㈧ python的作用
萬能編程語言「Python」的五大主要用途:
1、web開發
Python的誕生歷史比ewb還要早,由於Python是一種解釋型的腳本語言,開發效率高,所有非常適合用來做web開發。
Python有上百種web開發框架,有很多成熟的模板技術,選擇Python開發web應用,不但開發效率高,而且運行速度快。
常見的web開發框架:Django、flask、tornado等。
2、網路爬蟲
網路爬蟲是Python比較常用的一個場景,國際上,Google在早期大量地使用Python語言作為網路爬蟲的基礎,帶動了整個Python語言的應用發展。以前國內很多人用採集器搜刮網上的內容,現在用Python收集網上信息比以前容易了許多。比如:從各大網站抓取商品折扣信息,比較獲取最優選擇;對社交網路上發言進行收集分類,生成情緒地圖,分析語言習慣……爬蟲應用很多,幾乎每個人學習爬蟲之後都能夠通過爬蟲去做一些好玩有趣且有用的事情。
3、人工智慧
人工智慧是現在非常火的一個方向,AI熱潮讓Python語言的未來充滿了無限的潛力。
因為Python有很多庫很方便做人工智慧,比如Numpy、Scipy做數值計算的,Sklearn做機器學習的,pybrain做神經網路的,matplotlib做數據可視化的。在人工智慧大范疇領域內的數據挖掘、機器學習、神經網路、深度學習等方面都是主流的編程語言,得到廣泛的支持和應用。
4、數據分析
數據分析處理方面,Python有很完備的生態環境。大數據分析中涉及到的分布式計算、數據可視化、資料庫操作等,Python中都有成熟的模塊可以選擇完成其功能。對於Hadoop-MapRece和Spark,都可以直接使用Python完成計算邏輯,這無論對於數據科學家還是對於數據工程師而言都是十分便利的。
5、自動化運維
Python對於伺服器運維而言也有十分重要的用途。由於目前幾乎所有Linux發行版本都自帶了Python解釋器,使用Python腳本進行批量化的文件部署和運行調整都成了Linux伺服器上很不錯的選擇。Python中也包含了許多方便的工具,從調控ssh/sftp用的paramiko,到監控服務用的supervisor,再到bazel等構建工具,甚至conan等用於C++的包管理工具,Python提供了全方位的工具集合,而在這基礎上,結合web,開發方便運維的工具會變得十分簡單。
㈨ 常用的十大python圖像處理工具
原文標題:10 Python image manipulation tools.
作者 | Parul Pandey
翻譯 | 安其羅喬爾、JimmyHua
今天,在我們的世界裡充滿了數據,圖像成為構成這些數據的重要組成部分。但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。
圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。Python成為這種圖像處理任務是一個恰當選擇,這是因為它作為一種科學編程語言正在日益普及,並且在其生態系統中免費提供許多最先進的圖像處理工具供大家使用。
讓我們看一下可以用於圖像處理任務中的常用 Python 庫有哪些吧。
1.scikit-image
scikit-image是一個開源的Python包,適用於numpy數組。它實現了用於研究,教育和工業應用的演算法和實用工具。即使是那些剛接觸Python生態系統的人,它也是一個相當簡單直接的庫。此代碼是由活躍的志願者社區編寫的,具有高質量和同行評審的性質。
資源
文檔里記錄了豐富的例子和實際用例,閱讀下面的文檔:
http://scikit-image.org/docs/stable/user_guide.html
用法
該包作為skimage導入,大多數功能都在子模塊中找的到。下面列舉一些skimage的例子:
圖像過濾
使用match_template函數進行模板匹配
你可以通過此處查看圖庫找到更多示例。
2. Numpy
Numpy是Python編程的核心庫之一,並為數組提供支持。圖像本質上是包含數據點像素的標准Numpy數組。因此,我們可以通過使用基本的NumPy操作,例如切片、掩膜和花式索引,來修改圖像的像素值。可以使用skimage載入圖像並使用matplotlib顯示圖像。
資源
Numpy的官方文檔頁面提供了完整的資源和文檔列表:
http://www.numpy.org/
用法
使用Numpy來掩膜圖像.
3.Scipy
scipy是Python的另一個類似Numpy的核心科學模塊,可用於基本的圖像操作和處理任務。特別是子模塊scipy.ndimage,提供了在n維NumPy數組上操作的函數。該包目前包括線性和非線性濾波,二值形態學,B樣條插值和對象測量等功能函數。
資源
有關scipy.ndimage包提供的完整功能列表,請參閱下面的鏈接:
https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution
用法
使用SciPy通過高斯濾波器進行模糊:
4. PIL/ Pillow
PIL( Python圖像庫 )是Python編程語言的一個免費庫,它支持打開、操作和保存許多不同的文件格式的圖像。然而, 隨著2009年的最後一次發布,它的開發停滯不前。但幸運的是還有有Pillow,一個PIL積極開發的且更容易安裝的分支,它能運行在所有主要的操作系統,並支持Python3。這個庫包含了基本的圖像處理功能,包括點運算、使用一組內置卷積核的濾波和色彩空間的轉換。
資源
文檔中有安裝說明,以及涵蓋庫的每個模塊的示例:
https://pillow.readthedocs.io/en/3.1.x/index.html
用法
在 Pillow 中使用 ImageFilter 增強圖像:
5. OpenCV-Python
OpenCV( 開源計算機視覺庫 )是計算機視覺應用中應用最廣泛的庫之一 。OpenCV-Python 是OpenCV的python版API。OpenCV-Python的優點不只有高效,這源於它的內部組成是用C/C++編寫的,而且它還容易編寫和部署(因為前端是用Python包裝的)。這使得它成為執行計算密集型計算機視覺程序的一個很好的選擇。
資源
OpenCV-Python-Guide指南可以讓你使用OpenCV-Python更容易:
https://github.com/abidrahmank/OpenCV2-Python-Tutorials
用法
下面是一個例子,展示了OpenCV-Python使用金字塔方法創建一個名為「Orapple」的新水果圖像融合的功能。
6. SimpleCV
SimpleCV 也是一個用於構建計算機視覺應用程序的開源框架。有了它,你就可以訪問幾個高性能的計算機視覺庫,如OpenCV,而且不需要先學習了解位深度、文件格式、顏色空間等。
它的學習曲線大大小於OpenCV,正如它們的口號所說「計算機視覺變得簡單」。一些支持SimpleCV的觀點有:
即使是初學者也可以編寫簡單的機器視覺測試攝像機、視頻文件、圖像和視頻流都是可互操作的資源
官方文檔非常容易理解,而且有大量的例子和使用案例去學習:
https://simplecv.readthedocs.io/en/latest/
用法
7. Mahotas
Mahotas 是另一個計算機視覺和圖像處理的Python庫。它包括了傳統的圖像處理功能例如濾波和形態學操作以及更現代的計算機視覺功能用於特徵計算,包括興趣點檢測和局部描述符。該介面是Python語言,適合於快速開發,但是演算法是用C語言實現的,並根據速度進行了調優。Mahotas庫速度快,代碼簡潔,甚至具有最小的依賴性。通過原文閱讀它們的官方論文以獲得更多的了解。
資源
文檔包括安裝指導,例子,以及一些教程,可以更好的幫助你開始使用mahotas。
https://mahotas.readthedocs.io/en/latest/install.html
用法
Mahotas庫依賴於使用簡單的代碼來完成任務。關於『Finding Wally』的問題,Mahotas做的很好並且代碼量很少。下面是源碼:
https://mahotas.readthedocs.io/en/latest/wally.html
8. SimpleITK
ITK 或者 Insight Segmentation and Registration Toolkit是一個開源的跨平台系統,為開發人員提供了一套廣泛的圖像分析軟體工具 。其中, SimpleITK是建立在ITK之上的簡化層,旨在促進其在快速原型設計、教育、解釋語言中的應用。SimpleITK 是一個圖像分析工具包,包含大量支持一般過濾操作、圖像分割和匹配的組件。SimpleITK本身是用C++寫的,但是對於包括Python以內的大部分編程語言都是可用的。
資源
大量的Jupyter Notebooks 表明了SimpleITK在教育和研究領域已經被使用。Notebook展示了用Python和R編程語言使用SimpleITK來進行互動式圖像分析。
http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/
用法
下面的動畫是用SimpleITK和Python創建的剛性CT/MR匹配過程的可視化 。點擊此處可查看源碼!
9. pgmagick
pgmagick是GraphicsMagick庫的一個基於python的包裝。 GraphicsMagick圖像處理系統有時被稱為圖像處理的瑞士軍刀。它提供了一個具有強大且高效的工具和庫集合,支持以88種主要格式(包括重要格式,如DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF)讀取、寫入和操作圖像。
資源
有一個專門用於PgMagick的Github庫 ,其中包含安裝和需求說明。還有關於這個的一個詳細的用戶指導:
https://github.com/hhatto/pgmagick
用法
使用pgmagick可以進行的圖像處理活動很少,比如:
圖像縮放
邊緣提取
10. Pycairo
Pycairo是圖像處理庫cairo的一組Python捆綁。Cairo是一個用於繪制矢量圖形的2D圖形庫。矢量圖形很有趣,因為它們在調整大小或轉換時不會失去清晰度 。Pycairo是cairo的一組綁定,可用於從Python調用cairo命令。
資源
Pycairo的GitHub庫是一個很好的資源,有關於安裝和使用的詳細說明。還有一個入門指南,其中有一個關於Pycairo的簡短教程。
庫:https://github.com/pygobject/pycairo指南:https://pycairo.readthedocs.io/en/latest/tutorial.html用法
使用Pycairo繪制線條、基本形狀和徑向梯度:
總結
有一些有用且免費的Python圖像處理庫可以使用,有的是眾所周知的,有的可能對你來說是新的,試著多去了解它們。
㈩ python是什麼干什麼用的 四個你需要知道的主要用途
Python是一種全棧的開發語言,所以你如果能學好Python,那麼前端,後端,測試,大數據分析,爬蟲等這些工作你都能勝任。python有四大主要應用:網路爬蟲,web開發,人工智慧以及自動化運維。
1.網路爬蟲
相比與其他靜態編程語言,如java,c#,C++,python抓取網頁文檔的介面更簡潔。python的urllib2包提供了較為完整的訪問網頁文檔的API。抓取的網頁通常需要處理,比如過濾html標簽,提取文本等。python的beautifulsoap提供了簡潔的文檔處理功能,能用極短的代碼完成大部分文檔的處理。
2.web開發
python最大的特點就是簡潔,使用python做網站開發,在代碼的維護方面可以節省很大的精力。而且python還有很多優秀的web框架可以使用。
3.人工智慧
人工智慧的核心演算法是完全依賴於C/C++的,因為是計算密集型。Python是這些庫的API binding,使用Python是因為CPython的膠水語言特性,要開發一個其他語言到C/C++的跨語言介面,Python是最容易的,比其他語言的ffi門檻要低不少,尤其是使用Cython的時候,Python歷史上也一直都是科學計算和數據分析的重要工具,有numpy的底子,用numpy這樣的基礎庫既減少了開發工作量,也方便從業人員上手。
4.自動化運維
一個運維人員通常要管理上百、上千台伺服器,運維工作也變的重復、繁雜。把運維工作自動化,python能夠把運維人員從伺服器的管理中解放出來,讓運維工作變得簡單、快速、准確.