Python 與 R 效能大對決!實測比較 Python 和 R 處理數據時的記憶體使用&執行速度

  1. 前言
  2. 實測環境&版本
  3. 實測程式碼
    1. Python
    2. R
    3. 檢查 Test Data 是否相同
  4. 實測數據
  5. 實測結論
  6. 總結

前言

近期因為遇到在 GCP Compute Engine 跑 R 程式碼發生 OOM (Out of Memory)的記憶體問題,所以研究了很多關於 Python 和 R 之間的比較,看到不少文章都說 R 在效能、記憶體分配和垃圾處理(Garbage collect)上都是輸給 Python 的,也看到很多人不推薦使用 R 做大型數據處理。

秉持著研究精神,還是自己測一次最有感,所以這篇文章就是我自己實測的 Python VS. R 的記憶體 + 執行時間的大對決!

實測環境&版本

  • Macbook Pro
    • 晶片: Apple M3
    • 記憶體: 16 GB
    • MacOS: Sonoma 14.2
  • R
    • IDE: 採用最主流的 R Studio 來執行
    • Version:
      • R version: 4.3.3
      • pryr: 0.1.6
  • Python
    • IDE: 採用市占率最高的 VS Code 來執行
    • Version:
      • Python version 3.11.9
      • psutil: 6.0.0
      • numpy: 1.26.4

實測程式碼

這次直接由 ChatGPT-4o 幫我生成兩種不同程式語言的程式碼,我只有附上自己的註解,以及手動更改建立的數據大小而已(下面圖片中的程式碼範例皆為產出一個 70000 x 70000 的表)

Python

  • 利用 psutil 來測記憶體使用狀況
  • 利用 numpy 來建立一個測試用的大型數據

R

檢查 Test Data 是否相同

經過測試,Python 使用的

與 R 程式碼中的

兩者產出的數據是相同的 10 rows, 10 columns 數據表

實測數據

所有的測試都進行三重複,表格內的數字為三次的平均數。
R 在執行前都有清除環境內所有 Variable,並使用 R Studio 的功能釋放記憶體。
Python 則是每次執行都是新開一個 Terminal 進行。

兩者的 Initial memory usage 都很穩定:

  • R: 75 ~ 80 MB
  • Python: 35 ~ 37 MB
Data Shape[ R ]
Memory Used (MB)
[ R ]
Time Duration (sec)
[ Python ]
Memory Used (MB)
[ Python ]
Time Duration (sec)
1000 x 100085.60.0543.50.007
5000 x 5000270.40.21227.00.10
10000 x 10000842.60.67352.10.425
20000 x 200003131.43.323088.51.25
30000 x 300006946.123.46902.52.8
50000 x 50000Error: memory exhausted1100.9
min: 717.7
max: 1456.4
9.41
70000 x 70000Error: memory exhausted980.0
min: 412.0
max: 1724.0
18.6

實測結論

  • Python 在初始記憶體的使用量就比 R 低了約 53%
  • 在 1000~30000 範圍內,當數據越大,兩個程式語言的記憶體使用量和執行時間都隨之提升
  • 在 1000~30000 範圍內,當數據越大,Python 記憶體使用量有跟 R 越接近的趨勢,到 20000 以上時兩者已經幾乎差不多(6946.1 MB vs. 6902.5 MB)
  • 在數據到達 50000 x 50000 時 R 就會因超過記憶體無法執行,但 Python 仍然可以執行
  • Python 在 50000, 70000 時記憶體使用量反而下降,且每次執行差異滿大(所以實測結果表中額外紀錄了最小最大值的數據),猜測可能 Python 在超過記憶體的狀況下有其他記憶體分配方式
  • 不論數據大小,Python 執行速度都顯著比 R 快,最高可達 8 倍以上
Data ShapeMemory Improvement
By Python
Speed Improvement
By Python
1000 x 10001.97 x7.14 x
5000 x 50001.19 x2.10 x
10000 x 100002.39 x1.58 x
20000 x 200001.01 x2.66 x
30000 x 300001.01 x8.36 x

總結

測試後再度證實了大家所說的「R 不適合處理大型數據」這個論點,我覺得 R 的強項還是在統計、視覺化領域,像之前我也看過有人說 Python 有些統計套件做出來的結果並不正確,但如果不是要做統計和視覺化的話,數據相關的處理還是使用 Python 比較適合,更何況現在很多服務也不支援 R 語言,像是 GCP 的 Cloud Function 就沒有 R 的選項。

截至目前我個人感覺 R 有三個很大的缺點:

  • 效能差
  • Debug 困難
  • 社群支持較弱,很多常見的服務都不支援 R

總而言之:
如果你要做統計/資料視覺化 ➡️ 兩者你都可以考慮
如果你是要做數據處理的話 ➡️ 還是選擇 Python 吧!

發表留言