
122
|
第六章
3,716,789 branch-misses # 0.08% of all branches
14334.244888 task-clock # 0.999 CPUs utilized
751,185 page-faults # 0.052 M/sec
751,185 minor-faults # 0.052 M/sec
24 context-switches # 0.002 K/sec
5 CPU-migrations # 0.000 K/sec
14.345794896 seconds time elapsed
這告訴我們,導入
numpy
時,讓效能大幅提升的主要因素不是向量化的指令集,而是記
憶體局部性與減少的記憶體破碎。事實上,我們能夠從前述實驗中看到向量化大約只占
整體效能提升的 15%
4
。
瞭解記憶體議題是拖慢程式碼的主要因素並不會讓人太過驚訝,電腦原本就是設計來處
理這類問題的相關計算—將數字相乘及加總,瓶頸在於必須讓這些數字到達 CPU 的速
度夠快,好讓它盡其所能地進行計算。
記憶體配置與就地操作
為了最佳化記憶體支配的影響,讓我們試著使用範例 6-6 的相同方法,降低
numpy
程式
碼裡的記憶體配置數量。配置問題比先前討論的快取未命中還要嚴重。當資料不存在
於快取時,代替只是在 RAM 裡尋找它,配置也必須請求作業系統提供可運用的資料區
塊,然後保留它。對作業系統提出這類請求會產生遠超過單純填補快取的成本—填補快
取未命中是由主機板最佳化的硬體程序,配置記憶體則需要跟其他 ...