如何在 i5 上實現 20 倍的 Python 運行速度?

2021-01-10 雷鋒網

Intel Distribution for Python 在今年二月進行了更新——英特爾發布了 Update 2 版本。以「加速」為核心的它,相比原生 Python 環境有多大提升呢?

雷鋒網獲知,並行計算專家、前英特爾高級工程師 James Reinders 對老東家的產品進行了測試。他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!

至於他是怎麼做到的,請繼續往下看(含代碼)。

James Reinders

James Reinders:利用 Intel Distribution for Python,我實現了 Python 的 20 倍加速,並且可用單個命令關閉/啟用。這還不是在最優情況下,而在虛擬環境——在 VirtualBox(下文簡稱 VBox) 上運行的 openSUSE Linux Tumbleweed(即「滾動版本」,請參考 openSUSE 官網),使用的機器是四核 iMac。

這在 Windows, Linux 或 OS X 都能實現。英特爾並沒有把 openSUSE 加入經他們測試過的 Linux 配置列表中(SUSE Enterprise 在表中),但我在運行中並沒有遇到任何問題。

這就是我怎麼做的:

下載 Anaconda 命令行安裝程序,地址為 https://www.continuum.io/downloads 。

安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh

安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2

運行示例程序,看到在我的 openSUSE VBox 設置上有 15 到 20 倍的速度提升。

% source deactivate intelpy

% python < myprog.py

np.sin

102400 10000 36.1987440586

np.cos

102400 10000 36.1938228607

np.tan

102400 10000 51.487637043

% source activate intelpy

% python < myprog.py

np.sin

102400 10000 1.76131296158

np.cos

102400 10000 1.83870100975

np.tan

102400 10000 3.38778400421

That’s all!  The speed-ups are 20.6X, 19.7X, and 15.2X in this quick test running on a virtual machine.

Here’s my little Python program:

% cat myprog.py

import numpy as np

import time

N = 102400

x = np.linspace(0.0123, 4567.89, N)

def mine(x,Z,func,name):

  print name;

  start = time.time()

  for z in range ( 0, Z ) :

    y = func(x);

  end = time.time()

  print N, Z, end - start

  return

mine(x,10000,np.sin,'np.sin')

mine(x,10000,np.cos,'np.cos')

mine(x,10000,np.tan,'np.tan')

我花很短時間搞起來這個程序,用來驗證英特爾對加速 NumPy 中  transcendental expression 的承諾。 Cosine, sine 和 tangent 是我還能記得的、搞 TI calculator 時候用的  transcendental,所以我用它們來試。我決定對每一個進行十億級測試——運行超過十萬個數字的函數,重複超過一萬次。

雖然未必是一個很有意思的程序,但對於加速而言是個不錯的測試。

隨時加速 Python

我此前寫過一篇文章,討論「Python 加速」( 「accelerated Python」 )使其更適用於大數據和 HPC 應用。 在速度更快之外,我還展示了,使用 Conda 來開啟/關閉加速是多麼得容易。這非常贊,讓安裝它的決定變得更加安全、沒有顧慮——因為該功能是一個可選項。(對新手的提醒: Anaconda 是針對 Python 算法包的集合,Conda 則是 package manager,即算法包管理器。我兩個都用並且都很喜歡。)

我使用 「conda create」來創造被我稱之為 intelpy 的環境。然後,我能夠使用 「source activate intelpy」、「source deactivate intelpy」來激活、關閉它。

Intel Distribution for Python 帶來的大幅加速能力,讓 「accelerated Python」 變得更實用更讓人信服。

值得注意的是, 「accelerated Python」 只是使用更快的  Python 算法庫,不需要對代碼做任何改動。當然,我們的 Python 代碼必須使用了某些加速的東西,才能從中獲益。

據雷鋒網(公眾號:雷鋒網)得知,英特爾通過三大方面實現 Python 加速:

利用多核;

利用矢量指令(SIMD),比如 SSE, AVX, AVX2 和 AVX-512;

使用英特爾 Math Kernel Library (Intel MKL) 的更先進算法。

對於運行於矢量或矩陣上的程序,上述這些都會生效。對於偶爾的單獨 cosine,我們不應該期待大幅速度提升。同樣的,對於單核 CPU,我們也不應該有性能提升的幻想。當然,英特爾 72 核協處理器 Xeon Phi 會在大量多核應用的跑分中領先。在我的例子中,我的虛擬機只利用 iMac i5 的四個核心。

FFT 在 4 核虛擬機上有八倍性能提升

我也試了下  Fast Fourier Transforms (FFT)。使用與原始程序相同的設置,我只是按照如下方式運行 FFT 程序:

% source deactivate intelpy

% python < myfftprog.py

fft

5000 2.22796392441

fft

7000 8.74916005135

% source activate intelpy

% python < myfftprog.py

fft

5000 0.277629137039

fft

7000 1.11230897903

速度提升為 8 和 7.9 倍。當然,還是運行於四核 iMac 上的 openSUSE 和 VBox。

這是我的快速 FFT 程序:

% cat myfftprog.py

import numpy as np

import numpy.random as rn

import time

def trythis(Z):

  mat = rn.rand(Z,Z) + 1j * rn.randn(Z,Z)

  print 'fft'

  start = time.time()

  # 2D transform on a complex-valued matrix:

  result = np.fft.fft2(mat)

  end = time.time()

  print Z, end - start

  return

trythis(5000);

trythis(7000);

新 Python 加速

雷鋒網了解到,以下是 Intel Distribution for Python 全新 Update 2 版本中,得到了新的速度提升的方面:

優化 NumPy 的算術和 transcendental 表達

Transcendental expressions 包含我在快速示例程序裡用的 cosine, sine 和 tangen。這些優化的核心是對 NumPy 的改變,使得 primitives (在 ndarray 數據上進行運算)能選擇性地使用英特爾 MKL Short Vector Math Library (SVML) 和 MKL Vector Math Library (VML) 的能力。這使得 Python 利用處理器的最新矢量能力,包括多核優化和 AVX/AVX2/AVX-512。英特爾團隊表示,他們利用 Xeon Phi,實現過 NumPy 算術和 transcendental 運算在 vector-vector 和 vector-scalar 上最高 400 倍的速度提升。

優化 NumPy 和 SciPy 的 FFT

這些優化的核心是英特爾 MKL,一系列 NumPy、SciPy 函數都能用到它對 FFT 的原生優化。這些優化包含真實、複雜的數據類型,單精度和雙精度都包含 ( single and double precision),從一維到多維的數據,in place 或者 out of place。英特爾團隊見到過這項更新帶來 60 倍的性能提升。這使得 Python 的性能可與原生 C/C++ 程序相媲美。

優化內存管理

Python 是一門動態語言,為用戶管理內存。Python 應用的性能,在很大程度上取決於內存運行的性能,這包括內存分配、再分配(de-allocation)、複製和移動。英特爾提供的加速版本 Python,能在 NumPy 分配數組時保證最佳的  alignment,所以 NumPy、SciPy 的運算函數,能從相應排列的 SIMD 內存訪問指令獲益。英特爾表示最大的提升來自於對內存複製和移動運算的優化。

更快——能用 Conda 方便地關閉/啟用

Anaconda 英特爾渠道的最新加速版本 Python,為 Python 程序帶來顯著性能優化,而無需改變代碼。下載、安裝也很方便。

我真的特喜歡用 Conda 把它開啟/關閉這一功能。這方便了性能對比,並且讓我感到安心——沒有這個功能的話,我會對切換到超快的數學函數感到猶豫。

via infoworld

相關文章:

手把手教你用 Python 實現針對時間序列預測的特徵選擇

谷歌開源 Python Fire;一張圖讀懂 Python、R 的大數據應用等 | AI 開發者頭條

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速! 至於他是怎麼做到的,請繼續往下看(含代碼)。
  • 搭上python號小火箭,程序運行越來越快!
    但Python運行的慢是歷來被詬病的,一些人黑Python的一點是Python的程序運行速度奇慢。這一方面和語言有關,另一方面可能就是你代碼的問題。其實,無論使用哪種程式語言,特定程序的運行速度很大程度上都取決於該程序的開發人員及其編寫快而優的程序的技巧和能力。語言方面的問題我們解決不了,所以只能在編程技巧上來提高程序的運行效率。
  • 如何讓Python像Julia一樣快地運行
    包含下面的所有基準測試的完整代碼的 Notebook 可在此處(https://www.ibm.com/developerworks/community/blogs/jfp/resource/julia_python.zip)找到。 鑑於各種社交媒體上的評論,我添加了這樣一句話:我沒有在這裡使用 Python 的替代性實現。我沒有編寫任何 C代碼:如果您不信,可試試尋找分號。
  • 如何在Python中編寫簡單代碼,並且速度超越Spark?
    在小型數據集上使用pandas時,其性能表現不錯,但這隻發生在整個數據集適合內存且在pandas和NumPy層下使用已優化的C代碼進行處理的情況下。處理大量數據包含集中的的IO操作、數據轉換、數據拷貝等,拖慢了處理的速度。從本質上講,臭名昭著的GIL 給Python帶來了線程同步的困難,在處理複雜任務時非常低效,異步Python相對更好,但其開發複雜且無法解決固有的鎖定問題。
  • 如何使用python語言代碼實現判斷是否為回文
    工具Visual Studio 2019python運行環境技術python回文回文,是按照中心對稱,從左到右或從右到左,字符串都一樣的。如果想要python語言代碼實現回文判斷,若為回文,列印回文,否則列印不是回文。
  • 如何在Python中實現交互兩個數
    如何在Python中實現交互兩個數【原理】生活中我們要交互兩個杯中的水,小朋友們都知道我們需要再拿一個空杯子來倒換水,今天我們來探索一下python中如何實現交互兩個數【編程】首先我們需要輸入兩個數x=int(input("x="))
  • 6月份Github上熱門的開源項目
    該存儲庫包含Corona-Warn-App 的原生Android實現。這個項目的代碼實現。該存儲庫包含用於Corona-Warn-App的加密密鑰的伺服器的實現。OSX-KVMhttps://github.com/kholia/OSX-KVMStar 8876在 KVM+ QEMU 上運行 Mac OS X10.11.6 El Capitan 。
  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。C語言是可以用來編寫作業系統的貼近硬體的語言,所以,C語言適合開發那些追求運行速度、充分發揮硬體性能的程序。而Python是用來編寫應用程式的高級程式語言。當你用一種語言開始作真正的軟體開發時,你除了編寫代碼外,還需要很多基本的已經寫好的現成的東西,來幫助你加快開發進度。
  • 磁懸浮列車運行速度比高鐵快,它的原理是什麼,是如何實現懸浮的
    ,它的原理是什麼,是如何實現懸浮的  在現代化的陸地公共運輸體系中,高鐵無疑已然成為了其中的王者,憑藉著較高的運行速度以及更為舒適的運營環境,獲得了人們的青睞,在很多人看來,高鐵就是公共運輸發展的未來,給予其充分的發展時間,高鐵將會取代傳統的火車。
  • Python初學者請注意!別這樣直接運行python命令
    尤其是一些初學者將網上的Python軟體包、代碼下載的到本地~/Downloads文件夾後,就直接在此路徑下運行python命令,這樣做會給電腦帶來極大的隱患。別再圖方便了為何這樣做會有危險?首先,我們要了解Python程序安全運行需要滿足的三個條件:系統路徑上的每個條目都處於安全的位置;「主腳本」所在的目錄始終位於系統路徑中;若python命令使用-c和-m選項,調用程序的目錄也必須是安全的。如果你運行的是正確安裝的Python,那麼Python安裝目錄和virtualenv之外唯一會自動添加到系統路徑的位置,就是當前主程序的安裝目錄。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    大數據文摘出品來源:Medium編譯:王轉轉Python已經得到了全球程式設計師的喜愛,但是還是遭到一些人的詬病,原因之一就是認為它運行緩慢。其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。
  • python是什麼:Python相關內容了解
    今天來聊聊一篇關於python是什麼:Python相關內容了解的文章,現在就為大家來簡單介紹下python是什麼:Python相關內容了解,希望對各位小夥伴們有所幫助。現在,全世界差不多有600多種程式語言,但流行的程式語言也就那麼20來種。如果你聽說過TIOBE排行榜,你就能知道程式語言的大致流行程度。這是最近10年最常用的10種程式語言的變化圖:Python的功能:總的來說,這幾種程式語言各有千秋。C語言是可以用來編寫作業系統的貼近硬體的語言,所以,C語言適合開發那些追求運行速度、充分發揮硬體性能的程序。
  • 磁懸浮列車運行速度比高鐵快,那它如何實現懸浮的?看完就明白了
    磁懸浮列車運行速度比高鐵快,它的原理是什麼,是如何實現懸浮的在現代化的陸地公共運輸體系中,高鐵無疑已然成為了其中的王者,憑藉著較高的運行速度以及更為舒適的運營環境,獲得了人們的青睞,在很多人看來殊不知,除了高鐵之外,我們還有一種更為快捷的公共運輸工具,那就是磁懸浮列車,按照運行的原理來說,磁懸浮列車的運行速度是遠在高鐵之上的。實現當前這一技術的價值還未充分開發出來,磁懸浮列車的生產運營也暫且處於試驗階段,未能在全國範圍內廣泛應用。那麼磁懸浮列車的懸浮原理是什麼?它又是如何實現懸浮的呢?
  • 酷睿i3和i5以及i7有什麼區別
    臺式機的 i3 是雙核四線程,i5 既有雙核又有四核。筆記本的話 i3 i5 都是雙核四線程。i3 i5 區別還是在頻率跟有無睿頻技術上,頻率的話i5要明顯高已取消到該網頁的導航。結構上它用的是LGA1156 接口,Core i7用的是LGA1366。i5有睿頻技術,可以在一定情況下超頻。  Core i3可看作是Core i5的進一步精簡版(或閹割版),將有32nm工藝版本(研發代號為Clarkdale,基於Westmere架構)這種版本。
  • ProjectQ:解鎖Python實現量子計算的新方式!
    與IBM的QISKit類似,允許用戶在Python中實現量子程序,並以強大而直觀的語法訪問IBM Q Experience。ProjectQ可以將程序轉換為任何類型的後端,無論是在經典計算機上運行的模擬器還是實際的量子晶片。
  • 如何用python在工作中「偷懶」?
    (升職加薪了別忘了回來發紅包哦~)那麼如何將這些統統實現呢?我將這些分為以下幾類,大家可以自行評估,各取所需:系統錄入自動化由於你經常需要不斷的將一些信息錄入系統,每一次錄入的過程中你可能需要不斷的點擊一些按鈕,面對這種情況,完全可以寫一個自動腳本,每次代替你來執行這些點擊的行為。
  • 數據處理必看:如何讓你的 pandas 循環加快 71803 倍
    python 不能用任何內置函數,而且速度非常慢。在我們的示例中,我們得到了一個具有 65 列和 1140 行的數據幀,它包含 2016-2019 賽季的足球比賽結果。我們要創建一個新的列來指示某個特定的隊是否打過平局。
  • 教你如何使用Python的27萬代碼庫
    如果需要將私有軟體包發布到軟體包索引,建議的解決方案是運行自己的devpi項目部署一件值得注意的事 PyPi-Install庫僅嘗試簡化官方網站上指出的打包過程。此外,如果您想了解更多有關PyPI的信息,請訪問PyPi主頁。訪問PyPI下一節將介紹如何安裝Python「軟體包」的基礎知識。重要的是要注意,在此上下文中使用的術語「包」充當分發的同義詞。
  • 一篇文章教你用11行Python代碼實現神經網絡
    聲明:本文是根據英文教程 (用 11 行 Python 代碼實現的神經網絡)學習總結而來,關於更詳細的神經網絡的介紹可以參考我的另一篇博客:。A Neural Network in 11 lines of Python從感知機到人工神經網絡如果你讀懂了下面的文章,你會對神經網絡有更深刻的認識,有任何問題,請多指教。
  • python基礎知識科普:python的起源和發展史以及應用場景
    ,我們常用的是CPython(官方版本的C語言實現),其他還有Jython(可以運行在Java平臺)、IronPython(可以運行在.NET和Mono平臺)、PyPy(Python實現的,支持JIT即時編譯)Python目前有兩個版本,Python2和Python3,最新版分別為2.7.12和3.5.2,現階段大部分公司用的是