成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python正面硬剛C語言,結果會怎樣?

開發 后端
雷達數據可視化是雷達數據處理的最后階段,通常是將一個二維數組的數據轉換為扇形圖像。這個二維數組的行數對應著雷達的掃描半徑,掃描半徑越大,行數越多;數據的列數和雷達的掃描角度相關,掃描角度越大,列數越多。

[[419970]]

雷達數據可視化是雷達數據處理的最后階段,通常是將一個二維數組的數據轉換為扇形圖像。這個二維數組的行數對應著雷達的掃描半徑,掃描半徑越大,行數越多;數據的列數和雷達的掃描角度相關,掃描角度越大,列數越多。

雷達掃描數據樣例(掃描半徑1km,掃描范圍130°)

比如,上面這張圖就是一個掃描半徑1km、掃描范圍130°的雷達二維數據的直觀顯示,下面這張圖則是由這個數據轉換得到的扇形圖像。

原始數據轉扇形圖像(順時針掃描,初始相位155°)

二維數據轉扇形圖像的原理很簡單,就是將二維數據的每一列寫到輸出圖像的對應像素上。如果輸出圖像的扇形弧長比原始數據的列數多,則需要插值。下圖是二維數據轉扇形圖像的原理示意圖,原始數據共有8列,而輸出圖像的圓弧長24個像素(弧長取決于雷達掃描角度和掃描半徑),故每一列數據被重復操作了3次,每次的旋轉角度各不相同。

二維數據轉扇形圖像原理示意圖

近日有網友求援,要我幫忙優化一個用于雷達數據可視化的Python腳本。略作分析之后,基于二維數據轉扇形圖像的基本原理,我為求援的網友重寫了一個新的腳本文件,全部代碼大約50余行。

  1. # -*- coding:utf-8 -*- 
  2.  
  3. import os, time 
  4. import numpy as np 
  5. from PIL import Image 
  6.  
  7. def outimg(fn_squ, fn_fan, angle, r0=0, phase=180, cw=True): 
  8.     """將矩形圖像轉為環形 
  9.  
  10.     fn_squ      - 輸入文件名 
  11.     fn_fan      - 輸出文件名 
  12.     angle       - 環形夾角度數 
  13.     r0          - 環形內圓半徑,默認r0為0,輸出扇形 
  14.     phase       - 初始相位(原點在輸出圖像的中心,以指向右側的水平線為0°,逆時針方向為正) 
  15.     cw          - 順時針掃描 
  16.     ""
  17.  
  18.     im = np.array(Image.open(fn_squ)) # 讀圖像文件為NumPy數組 
  19.     h, w, d = im.shape # 矩形圖像的高度、寬度和通道數 
  20.  
  21.     r1 = h + r0 # 扇形半徑 
  22.     k = int(np.ceil(np.radians(angle)*r1/w)) # 插值系數(自動確定,無需修改) 
  23.  
  24.     xs = np.ones((2*r1-1, 2*r1-1), dtype=np.int32) * -1 # 列索引數組 
  25.     ys = np.ones((2*r1-1, 2*r1-1), dtype=np.int32) * -1 # 行索引數組 
  26.     rs = np.linspace(r1, r0, h) # 半徑序列 
  27.     hs = range(h) # 行序列 
  28.  
  29.     if cw: # 順時針掃描 
  30.         theta = np.radians(np.linspace(phase, phase-angle, k*w)) 
  31.     else: # 逆時針掃描 
  32.         theta = np.radians(np.linspace(phase, phase+angle, k*w)) 
  33.  
  34.     for i in range(k*w): 
  35.         x = np.int32(np.cos(theta[i])*rs) + r1 - 1 
  36.         y = -np.int32(np.sin(theta[i])*rs) + r1 + 1 
  37.  
  38.         xs[(y, x)] = i//k 
  39.         ys[(y, x)] = hs 
  40.  
  41.     im_fan = im[(ys, xs)] # 從原始數據得到扇形圖像數據 
  42.     im_fan[np.where(xs == -1)] = (0,0,0,0) # 空白部分置為透明 
  43.     Image.fromarray(im_fan).save(fn_fan) # 保存為文件 
  44.  
  45.  
  46. if __name__ == '__main__'
  47.     fn_squ = 'res/raw_d130_1km.png' 
  48.     fn_fan = 'res/fan_d130_1km.png' 
  49.  
  50.     t0 = time.time() 
  51.     outimg(fn_squ, fn_fan, angle=130, r0=100, phase=155, cw=True
  52.     t1 = time.time() 
  53.  
  54.     print('圖像已處理完并保存,耗時%d毫秒'%int((t1-t0)*1000)) 

使用上面展示的掃描半徑1km、掃描范圍130°的雷達二維數據(可直接下載圖像文件作為測試數據),這段代碼生成扇形圖像大約耗時1.6秒鐘。發給求援的網友之后,很快傳來了反饋消息:新的腳本不但可以正常運行,速度更是提升了20倍左右。略帶夸張的千恩萬謝之后,這位網友又說,他們原本對優化沒有抱多大期望,只想嘗試一下;如果優化結果不理想的話,打算用C替換這個腳本的;現在好了,處理速度足可滿足需求,無需再用C重寫了。

幫忙的事情算是圓滿結束了,但這位網友的話卻讓我萌生了一個想法:用C來實現同樣的功能,究竟會比Python快多少呢?平時總聽到很多人說,Python如何如何慢,何不借此問題,讓Python和C來一個正面較量呢?

坐而論道,不如起而行之。幾個小時之后,我寫完了下面這段同樣是實現二維數據轉扇形圖像的C代碼。其中加載圖像文件和保存圖像文件,借用了GitHub上的一個C/C++圖像庫。這個名為stb的圖像庫,并非無名之輩,單是Contributors就有188人之多,持續開發近10年之久,圈內也算小有名氣。若要運行下面的代碼,請先去stb的GitHub(https://github.com/nothings/stb/)下載stb_image.h和stb_image_write.h兩個頭文件。

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <windows.h> 
  4.  
  5. #define _USE_MATH_DEFINES 
  6. #include <math.h> 
  7.  
  8. #define STB_IMAGE_IMPLEMENTATION 
  9. #include "stb_image.h" 
  10.  
  11. #define STB_IMAGE_WRITE_IMPLEMENTATION 
  12. #include "stb_image_write.h" 
  13.  
  14. int main() { 
  15.     LARGE_INTEGER li; 
  16.     LONGLONG startTime, stopTime, freq; 
  17.     QueryPerformanceFrequency(&li); 
  18.     freq = li.QuadPart; 
  19.     QueryPerformanceCounter(&li); 
  20.     startTime = li.QuadPart; // 記錄開始時間 
  21.  
  22.     char* rawFile = "D://MyCcode//RadoData2Image//res//raw_d130_1km.png"
  23.     char* outFile = "D://MyCcode//RadoData2Image//res//fan_d130_1km.png"
  24.     int w_raw = 0, h_raw = 0, chn = 0; 
  25.  
  26.     unsigned char* radoData = stbi_load(rawFile, &w_raw, &h_raw, &chn, 0); 
  27.  
  28.     int r0 = 100, cw = 1, r1 = h_raw + r0; 
  29.     double angle = 130.0, phase = 155.0; 
  30.     int w_out = 2*r1 - 1, h_out = 2*r1 - 1; 
  31.     int size_out = w_out * h_out * chn; 
  32.     int k = (int)(ceil((M_PI*angle/180.0)*w_out/w_raw)); 
  33.     int arc = k * w_raw; 
  34.     double step = angle/(arc-1); 
  35.  
  36.     char* fanData; 
  37.     fanData = (char*)malloc(size_out); // 生成保存轉換結果的數組 
  38.     for (int i=0; i<size_out; ++i) { 
  39.         fanData[i] = 0; // 初始化像素,全部透明 
  40.     } 
  41.  
  42.     double theta, sinv, cosv; 
  43.     int x, y, col_raw, pos_raw, pos_out; 
  44.     for (int i=0; i<arc; i++) { 
  45.         if (cw == 1) 
  46.             theta = M_PI * (phase - i*step) / 180.0; 
  47.         else 
  48.             theta = M_PI * (phase + i*step) / 180.0; 
  49.  
  50.         sinv = sin(theta); 
  51.         cosv = cos(theta); 
  52.         col_raw = i/k; 
  53.  
  54.         for (int r=r0; r<r1; r++) { 
  55.             x = (int)(cosv*r) + r1 - 1; 
  56.             y = -(int)(sinv*r) + r1 + 1; 
  57.             pos_out = (y * h_out + x) * chn; 
  58.             pos_raw = ((h_raw - 1 - r + r0) * w_raw + col_raw) * chn; 
  59.             for (int j=0; j<4; j++) 
  60.                 fanData[pos_out+j] = radoData[pos_raw+j]; 
  61.         } 
  62.     } 
  63.  
  64.     // 將轉換結果保存為文件 
  65.     stbi_write_png(outFile, w_out, h_out, chn, fanData, 0); 
  66.  
  67.     QueryPerformanceCounter(&li); 
  68.     stopTime = li.QuadPart; // 記錄結束時間 
  69.     int costTime =(int)((stopTime-startTime)*1000/freq); 
  70.     printf("Time cost: %d ms\n", costTime); 
  71.  
  72.     return 0; 

激動人心的時刻終于到了,我迫不及待地點擊了“構建并運行”按鈕。看起來一切順利,屏幕迅速滾動并最終定格。

C代碼運行截圖

什么?2668毫秒?竟然比Python慢了1000毫秒?不可能!!!直覺告訴我,一定是哪里出現了問題。接下來我又花了幾個小時,反復檢查驗證,但結果和過程都沒有發現問題。下表是10次運行結果的耗時記錄,結果顯示,在相同的測試條件下,Python平均耗時1660毫秒,C平均耗時2582毫秒,Python耗時大約是C的64%。

No. Python C
1 1635ms 2596ms
2 1652ms 2599ms
3 1696ms 2609ms
4 1673ms 2557ms
5 1633ms 2550ms
6 1632ms 2584ms
7 1626ms 2567ms
8 1729ms 2603ms
9 1642ms 2562ms
1 1691ms 2593ms
平均 1660ms 2582ms
 

盡管不可思議,但我現在開始嘗試相信這個結果了。讀者您呢?要是有疑問或建議,歡迎留言。如有更加高效的Python代碼或著C代碼,請發私信給我,讓我們一起將這場Python和C語言的正面交鋒延續下去、延伸開來。

 

責任編輯:武曉燕 來源: Python作業輔導員
相關推薦

2020-07-29 14:35:33

Garmin勒索軟件網絡攻擊

2024-05-15 09:58:06

谷歌大模型

2021-07-26 16:08:36

AI Transformer人工智能

2013-07-29 17:04:18

2021-11-02 06:58:52

移位負數二進制

2011-07-14 22:25:36

2010-01-26 10:01:17

學習C++

2024-12-31 09:08:32

2018-09-04 08:33:41

WindowsLinux操作系統

2020-04-15 11:07:31

C語言對象思想

2021-11-08 07:27:19

黑客網絡安全網絡攻擊

2022-12-14 17:37:04

車聯網自動駕駛

2010-01-12 10:50:59

學習C++

2024-03-18 13:21:13

2019-05-10 16:25:24

出海西雅圖

2019-06-21 10:52:28

軟連接硬鏈接Linux

2013-08-20 09:48:59

2022-02-18 15:07:29

goroutinepanic協程

2022-08-06 16:33:01

C語言數組內存

2023-10-08 13:43:00

模型數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区在线 | 色综合天天天天做夜夜夜夜做 | 2018国产大陆天天弄 | 国产天天操 | 免费超碰 | 免费视频一区二区 | 欧美vide | 日本久久视频 | 亚洲色图综合 | 色伊人网| 国产专区在线 | 国产99久久 | 黄色男女网站 | 亚洲视频免费 | 国产伦精品一区二区三区高清 | 亚洲成人一区 | 欧美成人精品二区三区99精品 | 国产精品久久久久久亚洲调教 | 欧美中文在线 | 精品美女久久久久久免费 | 国内精品久久久久久久影视简单 | 日韩欧美精品一区 | 天天干夜夜操 | 成人在线视频网 | 在线观看一区 | 日本亚洲精品 | 秋霞av国产精品一区 | 久久精品一区二区 | 国产精品视频一二三 | 中文字幕一区二区三区精彩视频 | 中文字幕中文字幕 | 国产精品美女 | 亚洲免费人成在线视频观看 | 欧美区日韩区 | 国产精品久久国产精品 | 久久久入口 | 91在线精品一区二区 | 97国产在线视频 | 中文字幕国产视频 | 国产日韩欧美一区 | 日批免费在线观看 |