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