現(xiàn)在越來越多的軟件都Web化,瀏覽器化。雖然科學(xué)計算是一計算密集型的方向,對性能要求和實時性較高。但是數(shù)據(jù)計算方面也一直在做著這樣的探索和發(fā)展。 Jypyer notbook項目讓科學(xué)計算真正實現(xiàn)了Web化,而JS語言的發(fā)展和WebAssembly技術(shù)的興起,讓科學(xué)計算的瀏覽器化,在客戶端實現(xiàn)數(shù)據(jù)計算處理和可視化變成了可能。今天蟲蟲要給大家介紹就是一款來自Mozilla的實驗項目Pyodide,一款用于在瀏覽器中運行完整Python科學(xué)計算處理工具棧環(huán)境的軟件。 ![]() 概述 Pyodide項目源于Mozilla的項目Iodide。 Iodide是基于Web技術(shù)的數(shù)據(jù)科學(xué)實驗和通信工具。它旨在在瀏覽器中進行數(shù)據(jù)計算。問題是通用的瀏覽器語言JS,沒有成熟的數(shù)據(jù)科學(xué)處理庫,也缺乏一些數(shù)值計算很有用功能和數(shù)據(jù)結(jié)構(gòu),比如運算符重載等。雖然完善JS語言本身是一條路,但是這條路太慢,所以有必要投機取巧的走一條捷徑出來。這就是Pyodide項目的所做的事情:通過將成熟活躍的Python科學(xué)計算工具棧引入瀏覽器來滿足數(shù)據(jù)科學(xué)計算的需要。Pyodide提供了一個完整的標準Python解釋器,它完全在瀏覽器中運行,可以完全訪問瀏覽器的Web API。下面以一個快速實例開始: ![]() 代碼顯示效果如下: 了解更多關(guān)于Pyodide可以做的事情的最好方法就是去嘗試吧!有一個演示筆記本(50MB下載),介紹了高級功能。本文的其余部分將更深入地探討其工作原理。 技術(shù)架構(gòu) 類似項目分析 Pydodie設(shè)計時候參考了很多現(xiàn)有項目,在實現(xiàn)Python到瀏覽器這'最后一公里'問題上,市面上已經(jīng)有很多的項目,但是目前還沒有一個項目可以做到Python科學(xué)計算棧的轉(zhuǎn)化,該棧包括不限于Python類庫:NumPy,Pandas,Scipy以及Matplotlib。 Transcrypt項目可以實現(xiàn)Python到JS的轉(zhuǎn)換。由于轉(zhuǎn)換步驟本身發(fā)生在Python中,所以你需要提前完成所有的轉(zhuǎn)換,或通過與服務(wù)器通信來完成這項工作。這并不能實現(xiàn)用戶在瀏覽器中編寫Python并實現(xiàn)即寫急用的目標。 Brython和Skulpt項目實現(xiàn)了將標準Python解釋器重寫為JS,可以直接在瀏覽器中運行Python代碼。但是它們都是對Python的全新實現(xiàn),并且通過JS中引導(dǎo),所以他們無法兼容C編寫的Python擴展,比如NumPy和Pandas。因此,無法引入數(shù)據(jù)科學(xué)工具。 PyPyJs項目是使用emscripten和JS對PyPy的瀏覽器實現(xiàn)。就像PyPy一樣它可以快速地運行Python代碼。同樣它也有于PyPy同樣的C擴展性能問題。 上面這很多項目都無法解決Python科學(xué)計算的問題,這促成了Pydodie的出現(xiàn):構(gòu)建一個盡可能基于Python的標準并能兼容實現(xiàn)大多數(shù)數(shù)據(jù)科學(xué)家已經(jīng)使用的Python科學(xué)堆棧的工具庫的軟件。 Pydodie項目技術(shù)架構(gòu)的關(guān)鍵技術(shù)就是新興的emscripten和WebAssembly。使用他們實現(xiàn)將C語言編寫的現(xiàn)有代碼庫移植到瀏覽器運行。Pyodide使用Python化的emscripten類庫cpython-emscripten為基礎(chǔ)。 Emscripten和WebAssembly 關(guān)于emscripten互聯(lián)網(wǎng)上有大量的介紹,在此不在贅述,在Pyodide項目中它的作用是: 實現(xiàn)從C/C++到WebAssembly的編譯器。 實現(xiàn)兼容性層,使瀏覽器變?yōu)橐粋€本機計算環(huán)境。 WebAssembly是一種在現(xiàn)代Web瀏覽器中運行的新語言,是對JS腳本的補充。它以接近本機的性能運行在瀏覽器上,旨在作為C和C++等低級語言的編譯目標。 關(guān)于WebAssembly蟲蟲之前的文章中有介紹過,關(guān)注過蟲蟲的朋友可以在歷史文章中瀏覽學(xué)習。 我們知道,實現(xiàn)主流的Python解釋器是CPython是用C語言實現(xiàn)的,所以使用emscripten可以將其編譯為WebAssembly。 Pyodide組成和實現(xiàn)步驟 Pyodide主要架構(gòu)組成如下: 將主流Python解釋器(CPython)的源代碼和科學(xué)計算包(NumPy等)將其打包在一起,使用emscripten的編譯器將它們編譯為WebAssembly。 但是如果只是在瀏覽器總執(zhí)行這個WebAssembly還不夠,比如,無法在Web瀏覽器中執(zhí)行文件操作(加載和保存文件)。為此Pyodide還引入了用JavaScript編寫的虛擬文件系統(tǒng)。這些虛擬的文件駐留在瀏覽器選項卡性內(nèi)存中。 通過模擬文件系統(tǒng)和標準科學(xué)計算環(huán)境的其他功能,將實現(xiàn)通過極少的改動將整個Python科學(xué)計算環(huán)境挪到Web瀏覽器。整個實現(xiàn)步驟如下: 1、已編譯的Python解釋器為WebAssembly。 2、通過emscripten提供的一系列的JS,用來提供系統(tǒng)仿真。 3、打包文件系統(tǒng),包含Python解釋器所需的所有文件,包括Python標準庫。 這些文件可能非常大,比如Python本身為21MB,NumPy為7MB,等等依。好在這些軟件包只需要下載一次,然后將它們存儲在瀏覽器的緩存中。 局限性 通過運行CPython的單元測試對Pyodide做持續(xù)測試的,以便了解其通用性。目前還有功能是無法用的,比如Python線程。 由于瀏覽器的安全沙箱限制,一些他功能(比如如低級網(wǎng)絡(luò)Socket)也不能正正常工作。 性能問題 在JS虛擬機中運行Python解釋器會有性能損失,但是影響非常小,通過官方基準測試中表明:在Firefox上的比本機慢1x-12x,Chrome上慢1x-16x。還有就是,在Python中運行大量內(nèi)部循環(huán)的代碼往往比依賴于NumPy執(zhí)行其內(nèi)部循環(huán)的代碼更慢。下面是在Firefox和Chrome對比同硬件本機中運行各種純Python和Numpy基準測試的結(jié)果。 ![]() 測試數(shù)據(jù)和方法鍵github倉庫(iodide-project/) Python和JS的交互 如果Pyodide只能做到運行Python代碼并寫入標準輸出,雖然不錯,但是沒有實用價值。最重要是實現(xiàn)與瀏覽器API以及其他JS庫的交互。 類型轉(zhuǎn)換 Pyodide隱式地對Python和JS類型的轉(zhuǎn)換,下圖展示了兩種語言類型轉(zhuǎn)換的細節(jié): ![]() Python中dicts和對象實例是兩種不同的類型。 dicts只是健值的映射。而對象通常具對象屬性和方法(methond)。在JS中沒有dicts對應(yīng)的數(shù)據(jù)結(jié)果,通用Object的類型來表示。 Ptdodide在兩者轉(zhuǎn)化的時候需要用到代理和鴨子類型 代理 代理是另一種語言中變量的包裝器。代理不是簡單地在JS中讀取變量并根據(jù)Python結(jié)構(gòu)重寫它,代理保持原始JS變量并'按需'調(diào)用其方法。所以任何JS變量,都可以從Python完全訪問。 鴨子類型 鴨子類型是一個原則,而不是實際去問變量'你是鴨子嗎?', '你像鴨子一樣走路嗎?'和'你像鴨子一樣嘎嘎叫嗎?',然后推斷它是否是一只鴨子。通過鴨子類型Pyodide可以不用馬上考慮推如何轉(zhuǎn)換JS對象,而將其打包到代理中,讓使用它的代碼決定如何處理它。 當然,這種方法并能一直有效這,鴨子實際上有可能是一只兔子。Pyodide也提供了明確轉(zhuǎn)換處理方法。 ![]() Pyodide使用這種高度交互,深度集成,潛在轉(zhuǎn)換的方法把Python和JS融為一體。用戶通過Python進行數(shù)據(jù)處理,然后用JS實現(xiàn)其可視化。 訪問Web API和DOM 代理也是訪問Web API的關(guān)鍵。例如,Web API的很大部分位于文檔對象上。你可以通過以下方式從Python中獲得: from js import document 這會將 JS中的document對象作為代理引入到Python。然后在Python中調(diào)用它的方法: document.getElementById('myElement') 這些都通過代理來查找document對象可以即時執(zhí)行的操作。 Pyodide不需要包include所有的Web API的完整列表。 多維數(shù)組 有一些類型是數(shù)據(jù)計算必須要的數(shù)據(jù)類型,比如矩陣計算中用到的多維數(shù)組,Pyodide也特別支持這些數(shù)據(jù)。多維數(shù)組是值的集合,這些值都是同一類型,但是數(shù)量巨大。Pyodide的多維數(shù)組對比Python的列表或JS數(shù)組在性能上具有很大優(yōu)勢。 Python中,NumPy數(shù)組是多維數(shù)組的最常用的實現(xiàn)。JS中是TypedArrays,它只包含一個數(shù)字類型。但是這兩種類型都是一維的,多維數(shù)組需要在頂層來構(gòu)建。 由于現(xiàn)實中這些數(shù)組可能會變得非常大,在語言運行時之間復(fù)制會非常消耗資源,而且是個非常耗時的操作。 Pyodide中利用多維數(shù)組可以無需復(fù)制就能在Python和JS之間共享數(shù)據(jù)。多維數(shù)組通常使用少量元數(shù)據(jù)來實現(xiàn),這些元數(shù)據(jù)描述了值的類型,數(shù)組的形狀和內(nèi)存布局。數(shù)據(jù)本身通過指向內(nèi)存中另一個位置的指針在元數(shù)據(jù)中索引。這個內(nèi)存地址位于WebAssembly堆區(qū)的,可以在JS和Python中訪問。通過在兩種語言中復(fù)制元數(shù)據(jù),來達到共享其指針指向的WebAssembly堆數(shù)據(jù)。 ![]() 實時交互式可視化 在客戶端瀏覽器中進行科學(xué)數(shù)據(jù)計算的優(yōu)點之一是,交互式可視化不必通過網(wǎng)絡(luò)進行通信以重新處理和重新顯示其數(shù)據(jù)。這大大減少了交互的延遲。 完成實時交互可視的工作需要各部分的組件協(xié)同工作。下面是一個官方交互式示例動態(tài)圖,它展示了使用matplotlib進行對數(shù)正態(tài)分布。 首先,使用Numpy在Python中生成隨機數(shù)據(jù)。 其次,在Matplotlib獲取該數(shù)據(jù),并使用其內(nèi)置的軟件渲染器繪制它。 最后通過Pyodide零拷貝數(shù)組共享將像素發(fā)送回JS端,在HTML畫布中呈現(xiàn)出來在瀏覽器中將這些像素顯示出來。 用于支持交互性的鼠標和鍵盤事件由從Web瀏覽器調(diào)用Python的回調(diào)函數(shù)處理。 打包 Python科學(xué)計算工具棧由很多分散的軟件包構(gòu)成,這些包協(xié)同工作創(chuàng)建一個高效的計算環(huán)境。工具棧中最受歡迎的是NumPy(數(shù)值數(shù)組和基本計算),Scipy(更復(fù)雜的通用計算,如線性代數(shù)),Matplotlib(可視化)和Pandas(用于表格數(shù)據(jù)或數(shù)據(jù)幀處理)。目前Pyodide官方倉庫中包含的包見下圖,更多的包還在不斷完善和添加中: ![]() 有些包很容易引入進來。通常,使用純Python編寫而沒有其它編譯語言擴展的包都非常容易。像Matplotlib這樣的項目需要使用特殊代碼在HTML畫布中顯示繪圖包為中等難度。而諸如Scipy這樣的包的引入則比較困難。 官方內(nèi)置的包有限,用戶可以根據(jù)需要自引入所需的個性化包,比如: import numpy as np 上面語法中,Pyodide會引入NumPy庫及其所有依賴項,并將其加載到瀏覽器中。而且包引入瀏覽器后會被緩存起來,下次加載時不需要重復(fù)下載。 給Pyodide打包添加新軟件包,目前還不支持動態(tài)引入。需要手動添加。據(jù)悉未來版本Pyodide將會增加對PyPI的支持。 多語言支持 Pyodide目前已經(jīng)得到很多語言社區(qū)的的關(guān)注,目前已經(jīng)有Julia,R,OCaml,Lua等語言實現(xiàn)良好的瀏覽器運行時。Pyodide還與Iodide等網(wǎng)絡(luò)優(yōu)先工具實現(xiàn)了集成。 Pyodide定義了一個集成級別,用來實現(xiàn)與其他語言及工具的集成: 第一級別:字符串輸出,可以作為基本控制臺REPL(read-eval-print-loop)。 第二級別:支持將基本數(shù)據(jù)類型(數(shù)字,字符串,數(shù)組和對象)轉(zhuǎn)換為JS或從JS轉(zhuǎn)換。 第三級別:在客戶語言和JS之間共享類實例(帶方法的對象)。這允許Web API訪問。 第四級別:在客戶語言和JS之間共享科學(xué)計算相關(guān)類型(n維數(shù)組和數(shù)據(jù)框)。 結(jié)論 Pydodide提供了我們一種很酷的科學(xué)數(shù)據(jù)編程和用戶體驗。雖然目前還處于實驗性概念驗階段,但是我們已經(jīng)可以考慮將其做為日常數(shù)據(jù)科學(xué)工作的選擇,并嘗試給它的完善壯大添磚加瓦。 |
|
來自: flyk0tcfb46p9f > 《AI》