Week4 - I/O

  • 什麼是 I/O Bound 和 CPU Bound 的程式?

  • I/O 繁重

    • 需要花費大部分時間在「輸入、輸出」操作上的程式。
      • 因此要等待作完成(如:讀取資料)
    • 決定速度的關鍵是:網路速度或硬碟讀寫速度,而非 CPU。
    • 解決方式:著重非同步、優化程式效率
    • 使用實例:電商網站操作 SQL 資料庫
  • CPU 繁重

    • 需要大量計算或需要頻繁執行的程式
    • 增加 CPU 的速度可以直接提高程式的效能
    • 解決方式:優化演算法、加快 CPU、多執行緒、多進程、向量化
    • 使用實例:電商網站操作 SQL 資料庫
      e.g. 使用 Threads 加快爬蟲效率 => 一次啟動三個 Threads 同時爬取資料,完成速度快兩倍以上。
  • Python 執行速度明顯比許多其他程式語言來得慢,為什麼 Pinkoi 以及為數不少的公司,仍然願意使用 Python 當作後端系統的解決方案?

    • 易於學習、使用
    • 可讀性與維護性:語法結構清晰,程式碼的可讀性與維護性相對高
    • 適合資料驅動的公司:有各種套件庫(NumPy, pandas, TensorFlow和scikit-learn)
    • 跨平台
  • 後見之明

    • 社群支援:龐大且活躍
    • 後端生態系完整 (django, flask)
  • 電腦中的記憶體(RAM) Main Memory 和硬碟 Disk or Drive 有什麼差別?

類型/比較 快取記憶體 (RAM) 硬碟 (DISK/DRIVE)
材料 半導體 磁性材料
儲存類型 揮發性記憶體 非揮發性儲存設備
關機會怎樣? 易失性存儲,資料會被清空 仍可被保存
用途 儲存當前正在執行的程式和資料 長期儲存系統、應用程式和使用者資料
讀寫速度 很快,直接與 CPU 交換資料 普通,需要過 I / O 控制器
容量 很大
- 價格
讀寫方式 電子狀態 物理磁頭
  • 請調查你自己的電腦,記憶體空間和硬碟空間各是多少?各值多少錢?

記憶體 32GB(RAM),硬碟空間 1TB(994 GB 可用)

  • 程式中什麼時候會使用到記憶體空間、什麼時候會使用到硬碟空間?

類型/比較 快取記憶體 (RAM) 硬碟 (DISK/DRIVE)
程式運行 讓 CPU 快速存取和執行程式指令 儲存資料,執行程式時給 RAM 處理
使用時機 需要儲存或操作資料時(例如:變數、陣列、物件等) 儲存程式的原始程式碼和執行檔
使用時機 快取(緩存)和緩衝區 長期或永久性的資料儲存
- 實例 網路讀取資料、啟動程式 操作資料庫中的資料、使用者的文件和設定、操作系統、應用程式、Cache
RAM 不足時 會改用硬碟 模擬RAM,稱為虛擬記憶體,但會很慢
  • 程式中使用變數儲存一個整數 3 要使用多少記憶體空間?

這取決於你的系統架構(32 位元或 64 位元)和你所使用的程式語言。

系統架構 ——

  • 32 位元(4 位元組)
  • 64 位元(8 位元組)記憶體(已為主流)

在 64 位元的系統中:

import sys
sys.getSizeof(3)
類型/比較 Python C / C++ JavaScript
程式運行 28 位元組 4 位元組(32 位元) 、8 位元組(64 位元) **int ** 8 位元組(64 位元)

通常會在 4 到 28 位元組之間

JavaScript 並不直接操作記憶體,而是透過宿主環境(如瀏覽器或 Node.js)來管理記憶體。

在 JavaScript 中都按照 IEEE 754 標準來儲存:8 位元組。
數字物件可能會使用更多,如儲存物件類型。
實際的記憶體使用可能會更多,因為需要儲存額外的 meta 資訊。

  • 為什麼常見的電腦系統需要記憶體?難道不能直接存取硬碟空間來運作就好了嗎?

效能太差

  • 硬碟讀取和寫入的速度遠不如 RAM
  • 當開啟應用程式或打開文件時,資料會被載入到 RAM 中,以便快速存取和處理