深度剖析Python 工具特性
下面給大家進行詳細說明下什么是Python 工具,對于那些從來沒有學(xué)習(xí)過編程或者并非計算機專業(yè)的編程學(xué)習(xí)者而言,Python應(yīng)用語言是***的選擇之一,它具備簡單清晰的語言特點。
但在其它時候,只有實際運行(或模擬)系統(tǒng)時,具體設(shè)計的缺陷才會顯現(xiàn)出來。本文中,David 討論了 SimPy,它是一種 Python 包,允許您非常方便地創(chuàng)建離散事件系統(tǒng)的模型。
在我遇到 SimPy 包的其中一位創(chuàng)始人 Klaus Miller 時,從他那里知道了這個包。Miller 博士閱讀過幾篇提出使用 Python 2.2+ 生成器實現(xiàn)半?yún)f(xié)同例程和“輕便”線程的技術(shù)的可愛的 Python 工具專欄文章。特別是(使我很高興的是),他發(fā)現(xiàn)在用 Python 實現(xiàn) Simula-67 樣式模擬時,這些技術(shù)很有用。
結(jié)果表明 Tony Vignaux 和 Chang Chui 以前曾創(chuàng)建了另一個 Python 庫,它在概念上更接近于 Simscript,而且該庫使用了標準線程技術(shù)。而不是我的半?yún)f(xié)同例程技術(shù)。該小組在一起研究時,認為基于生成器的樣式更有效得多,并且最近在 SourceForge 上發(fā)起了使用 GPL 的項目。
稱為 SimPy(請參閱參考資料,獲得 SimPy 主頁的鏈接),目前處于 beta 測試版狀態(tài)。Vignaux 教授希望他在惠靈頓維多利亞大學(xué)(University of Victoria)的將來大學(xué)教學(xué)中使用統(tǒng)一的 SimPy 包;
我相信該庫也非常適合應(yīng)用到各類實用問題中。我承認在近期的通信交流和調(diào)查研究之前,我對編程領(lǐng)域的模擬方面沒有任何基礎(chǔ)知識。我猜想本專欄文章的大部分讀者也和我一樣,對這方面的知識知之甚少。
盡管有人會認為這種樣式編程的方式有些新奇,但在理解資源有限的實際系統(tǒng)的行為時,模擬是很有用的。不管您感興趣的是有限帶寬網(wǎng)絡(luò)、汽車交通行為、市場和商業(yè)性優(yōu)化、生物/進化的交互作用還是其它“隨機”系統(tǒng),SimPy 對這樣的建模都提供了簡單的 Python 工具。
我將使用食品雜貨店內(nèi)具有多條通道的付款區(qū)域這個相當簡單的示例。通過使用所演示的模擬,我們可以根據(jù)對掃描器技術(shù)。購物者習(xí)慣、人員配備需求等進行的各種更改所產(chǎn)生的經(jīng)濟上和等待時間上的含義提出問題。這個建模的優(yōu)點是在您對所做的更改產(chǎn)生的含義有清晰的想法時。
它讓您能提前制定策略。很明顯,大多數(shù)讀者不會專門經(jīng)營一家食品雜貨店,但這些技術(shù)可以廣泛地應(yīng)用于各類系。SimPy 庫只提供了三個抽象/父類,并且它們對應(yīng)于模擬的三個基本概念。有許多其它常規(guī)函數(shù)和常量用于控制模擬的運行,但重要的概念都與這些類結(jié)合在一起。
模擬中的核心概念是進程。一個進程只是一個對象,它完成某些任務(wù),隨后在它準備完成下一個任務(wù)之前有時會等待一會兒。在 SimPy 中,您還可以“鈍化”進程,這意味著在一個進程完成一個任務(wù)后,只有當其它進程要求該進程完成其它任務(wù)時,它才會去做。
把進程當作嘗試完成一個目標,常常是很有用的。在編寫進程時,通常把它編寫成可以在其中執(zhí)行多個操作的循環(huán)。在每個操作之間,可以插入 Python 工具語句,它讓模擬調(diào)度程序在返回控制之前執(zhí)行每個等待進程的操作。
進程執(zhí)行的許多操作取決于資源的使用。資源只是在可用性方面受到限制。在生物學(xué)模型中,資源可能是食物供應(yīng);在網(wǎng)絡(luò)模型中,資源可以是路由器或有限帶寬通道;在我們的市場模擬中,資源是付款通道。資源執(zhí)行的唯一任務(wù)是在任何給定的時間內(nèi)將它的使用限于一個特定的進程上。
在 SimPy 編程模型下,進程單獨決定它要保留資源的時間有多長,資源本身是被動的。在實際系統(tǒng)中,SimPy 模型可能適合概念性方案,也可能不適合;很容易想象到資源在本質(zhì)上會限制其利用率(例如,如果服務(wù)器計算機在必需的時間幀內(nèi)沒有獲得滿意的響應(yīng),則它會中斷連接)。
但作為編程問題,進程或資源是否是“主動”方就不是特別重要(只要確保您理解了您的意圖)。***一個 SimPy 類是監(jiān)控程序。實際上監(jiān)控程序不是很重要,只不過它很方便。監(jiān)控程序所做的全部任務(wù)就是記錄向它報告的事件,并保存有關(guān)這些事件的統(tǒng)計信息(平均值、計數(shù)、方差等)。
該庫提供的 Monitor 類對記錄模擬措施是個有用的工具,但您也可以通過您想使用的其它任何技術(shù)來記錄事件。事實上,我的示例使 Monitor 子類化,以提供某些(稍微)增強的能力。
【編輯推薦】