python和node_Python和NodeJS绘图对比
在繪圖方面,Python 比 NodeJS 好用,首先 Python 繪圖庫多,而且 API 強(qiáng)大而完善。 NodeJS 還是少點(diǎn),一些庫還沒測就放棄了,需要 window 支持,而我需要在后端執(zhí)行。
最近一直在搞地面雷達(dá)的可視化工作。在研究如何將基數(shù)據(jù)可視化過程中,著實(shí)汲取了相當(dāng)多的知識和技能。
傳統(tǒng)的雷達(dá)數(shù)據(jù)可視化采用圖片方式,同一時刻,雷達(dá)基數(shù)據(jù)會產(chǎn)生多種單站產(chǎn)品和組合產(chǎn)品,針對不同數(shù)據(jù)產(chǎn)品生成不同的圖像。這樣會產(chǎn)生大量的圖像數(shù)據(jù)和基數(shù)據(jù),對數(shù)據(jù)容量是個考驗(yàn)不說,圖像本身也非矢量,渲染效果總不是那么好。
所以最開始想用 GIS 的方式將數(shù)據(jù)直接渲染,理想中使用 Mapbox 是美麗的,省去了圖像數(shù)據(jù),使用 Geojson Layer 在縮放過程中,都能清晰得看影像。但最終效果不然,明顯的一點(diǎn)是會存在空隙,即使將 Circle 放大尺寸,也達(dá)不到理想的效果。
最終除了風(fēng)速風(fēng)向數(shù)據(jù)(數(shù)據(jù)量小,而且不需要填充),其余的還是采用了傳統(tǒng)的圖片渲染方式。在接下去的過程中,我開始同時使用 NodeJS 和 Python 來實(shí)現(xiàn)。說真的,我越來越喜歡 NodeJS,他無所不能,從前端到后端,無孔不入。我已經(jīng)開始慢慢從 Python 遷移到 NodeJS。在這個工作上,他的異步方式讓讀取文件,簡單快速,比 Python 好用多了。讓我在用 Python 實(shí)現(xiàn)的同時,也想用 NodeJS 寫一遍,如果可行的話,直接在后期將項(xiàng)目遷移到 NodeJS。
扯遠(yuǎn)了,回到主題。大部分?jǐn)?shù)據(jù)產(chǎn)品的生成方式是一樣的,總共會出現(xiàn)兩種情況。
第一種是分辨率為 620*490 格點(diǎn)數(shù)據(jù),每個格點(diǎn)的值對應(yīng)一種顏色。這種情況比較簡單,只需要創(chuàng)建一個寬高為 620x490 的圖像,然后修改對應(yīng)格點(diǎn)坐標(biāo)的顏色即可。
Python PIL 處理時間 1s,其中讀文件數(shù)據(jù) 80 ms
NodeJS pngjs 處理時間從讀取到繪圖 35ms
可謂差距明顯。
第二種是掃描一圈的數(shù)據(jù),半徑等分 920 個圈,每圈再等分 372 個點(diǎn)數(shù)據(jù),需要填充成圓弧的值對應(yīng)一種顏色,這個是最效率最低的,因?yàn)槊總€圈等分后需要填充,涉及到圓弧的計算。
比較完美的做法就是使用 drawArc 方法,這樣能畫出一個完整漂亮的圓,計算 372×920 個圓弧,但是 Python PIL 庫的 arc 方法不支持浮點(diǎn)型的弧度值,從而不得不使用其他方法。對 Python 來說,繪圖的庫無非就是 Matplotlib 和 PIL 這倆,Matplotlib 使用了一下算是翻車了,等得我直接 ctrl c 了。
NodeJS 的畫圖庫很少,pngjs 無法繪圖。用了一個基于 graphicsmagick 的庫——gm,graphicsmagick 是一個強(qiáng)大的圖像處理程序,使用 C 寫的,有各種流行語言的 SDK。結(jié)果,翻車了,得花 10 幾分鐘才能處理完。順便我用了 Python 的 SDK,也挺慢,大概 10 秒,而且繪圖的時候,是完全并發(fā)的。本來以為相對慢是 Python 語言的性能導(dǎo)致的,然后用 C++ 的 SDK 寫了一下,運(yùn)行也得花 7 秒,看了下 Python 的源碼,貌似 graphicsmagick 只映射了方法,最終還是調(diào)用了 C 的 graphicsmagick。
放棄了 drawArc 方法,那只能采用 drawPolygon 方法了,計算出圓環(huán)扇形四個點(diǎn)的坐標(biāo)畫一個梯形,顯然最終的圓不是完整的圓,是一個 372 邊形,不過由于等分得很細(xì),肉眼沒有那么清晰的分辨,幾乎等同于圓了。主要是省去了很多計算的時間。
graphicsmagick Python 畫 Polygon 性能還是得不到明顯的提升,而 node 的 gm 繼續(xù)翻車。用回了 PIL,他的 drawPolygon 方法支持浮點(diǎn)數(shù)據(jù),處理完花了 1.3 秒,可謂很快了,而且是單核的,多進(jìn)程下可以同時處理。NodeJS 使用了 svg.js 庫,但是處理過程中因?yàn)?svg 數(shù)據(jù)一直在添加 polygon 導(dǎo)致內(nèi)存飆升了 2-3G,從 svg 轉(zhuǎn)換 png 也花了相同的時間,最終花了 5.8 秒。我想這算是用 NodeJS 處理最快的一次了。
在繪圖工作的過程中,嘗試了各種手段,從簡單理解圖像的原理到理解了繪圖的原理,獲益匪淺。目前來看,對于我的需求,NodeJS 還未能滿足,但是 NodeJS 并不是做不到,而是沒有好的工具。
總結(jié)
以上是生活随笔為你收集整理的python和node_Python和NodeJS绘图对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++怎么输入带有空格的字符串_杭电OJ
- 下一篇: python怎么引用多行输入_pytho