前言
近期因為遇到在 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 使用的
np.random.rand(10, 10)
與 R 程式碼中的
matrix(runif(10 * 10), nrow = 10, ncol = 10)
兩者產出的數據是相同的 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 1000 | 85.6 | 0.05 | 43.5 | 0.007 |
| 5000 x 5000 | 270.4 | 0.21 | 227.0 | 0.10 |
| 10000 x 10000 | 842.6 | 0.67 | 352.1 | 0.425 |
| 20000 x 20000 | 3131.4 | 3.32 | 3088.5 | 1.25 |
| 30000 x 30000 | 6946.1 | 23.4 | 6902.5 | 2.8 |
| 50000 x 50000 | Error: memory exhausted | – | 1100.9 min: 717.7 max: 1456.4 | 9.41 |
| 70000 x 70000 | Error: memory exhausted | – | 980.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 Shape | Memory Improvement By Python | Speed Improvement By Python |
|---|---|---|
| 1000 x 1000 | 1.97 x | 7.14 x |
| 5000 x 5000 | 1.19 x | 2.10 x |
| 10000 x 10000 | 2.39 x | 1.58 x |
| 20000 x 20000 | 1.01 x | 2.66 x |
| 30000 x 30000 | 1.01 x | 8.36 x |
總結
測試後再度證實了大家所說的「R 不適合處理大型數據」這個論點,我覺得 R 的強項還是在統計、視覺化領域,像之前我也看過有人說 Python 有些統計套件做出來的結果並不正確,但如果不是要做統計和視覺化的話,數據相關的處理還是使用 Python 比較適合,更何況現在很多服務也不支援 R 語言,像是 GCP 的 Cloud Function 就沒有 R 的選項。
截至目前我個人感覺 R 有三個很大的缺點:
- 效能差
- Debug 困難
- 社群支持較弱,很多常見的服務都不支援 R
總而言之:
如果你要做統計/資料視覺化 ➡️ 兩者你都可以考慮
如果你是要做數據處理的話 ➡️ 還是選擇 Python 吧!