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

2020-12-15 中文業界資訊站

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

相關焦點

  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。這還不是在最優情況下,而在虛擬環境——在 VirtualBox(下文簡稱 VBox) 上運行的 openSUSE Linux Tumbleweed(即「滾動版本」,請參考 openSUSE 官網),使用的機器是四核 iMac。這在 Windows, Linux 或 OS X 都能實現。
  • 如何用i5實現20倍的Python運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。James ReindersJames Reinders:利用 Intel Distribution for Python,我實現了 Python 的 20 倍加速,並且可用單個命令關閉/啟用。
  • 酷睿i5性能這樣瞬間提升20倍!
    他對外宣布:在配備四核i5的iMac上實現了20倍的性能加速,至於他是怎麼做到的,請繼續往下看(含代碼)。ames Reinders:利用Intel Distribution for Python,我實現了 Python 的20倍加速,並且可用單個命令關閉/啟用。
  • 一行代碼讓你的Python運行速度提高100倍!Python真強!
    今天,帶大家學習如何讓Python飛起來的方法,乾貨滿滿哦!python一直被病垢運行速度太慢,但是實際上python的執行效率並不慢,慢的是python用的解釋器Cpython運行效率太差。「一行代碼讓python的運行速度提高100倍」這絕不是譁眾取寵的論調。我們來看一下這個最簡單的例子,從1一直累加到1億。
  • 入門 | 三行Python代碼,讓數據預處理速度提高2到6倍
    本文可以教你僅使用 3 行代碼,大大加快數據預處理的速度。Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理數據。但當我們面臨大量數據時,一些問題就會顯現……目前,大數據(Big Data)這個術語通常用於表示包含數十萬數據點的數據集。在這樣的尺度上,工作進程中加入任何額外的計算都需要時刻注意保持效率。
  • 三行Python代碼,讓數據處理速度提高2到6倍
    在當前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時候,這種情況會變得更加明顯。使用 for 循環逐個處理每個數據,然後在每個循環迭代上運行預處理。讓我們在一個包含 1000 個 jpeg 文件的文件夾上測試這個程序,看看運行它需要多久:time python standard_res_conversion.py在我的酷睿 i7-8700k 6 核 CPU 上,運行時間為 7.9864 秒!
  • 一個簡單的更改讓PyTorch讀取表格數據的速度提高20倍
    我將向您展示我在PyTorch中對表格的數據加載器進行的簡單更改如何將訓練速度提高了20倍以上,而循環沒有任何變化! 這只是PyTorch標準數據加載器的簡單替代品。 對於我正在訓練的模型,可以16分鐘的迭代時間,減少到40秒!所有這些都無需安裝任何新軟體包,不用進行任何底層代碼或任何超參數的更改。
  • 代碼詳解:如何用Python運行高性能的數學範式?
    對於以性能為核心的應用程式和數據處理通道來講,需要運行最佳範例並選擇正確的庫集。那麼,在開發和學習中有哪些技巧呢?首先需要明確的是:編寫python代碼和編寫pythonic代碼之間存在很大差異。我們可以使用numpy vectorization tack實現相同的算法。
  • 【Python】建立gRPC服務端與.Net Core 客戶端
    由於需要接入其他平臺的OAuth 2.0,還要提供RESTful API獲取VMware vSphere的數據,這塊內容,.net core我更熟悉,所以鎖定ASP.NET Core,通過上兩篇,我們知道這裡只能通過python去獲取數據了,那麼我面臨的問題就是python與.net core的數據通信:方法一:使用Python的web
  • 如何用iPad運行Python代碼?
    你需要能運行代碼,並且第一時間獲得結果反饋。在此基礎上,你還得能修改代碼,對比前後執行結果的差別。我得給你提供一個直接可以運行的環境。零安裝,自然也就沒了上述煩惱。這個事兒可能嗎?我研究了一下,沒問題。
  • Python之父又立Flag:明年讓Python快2倍
    Python之父Guido van Rossum提出要在未來四年內將CPython速度提升5倍。這意味著我們可以不用擔心破壞其可靠性,而是專注在性能上。並且,Shannon之前參與的HotPy項目中所開發的解釋器,比目前CPython解釋器的純Python代碼快三倍。這證明了對CPython優化的可行性。而在去年10月份的時候,耐不住退休寂寞的Guido又加入了微軟:
  • Python日課-2.5-python語言的不同實現
    Python 日課 2021-01-14:Python語言的不同實現。各位同學,今天來說說Python語言的種類吧。CPythonhttps://python.org我們平時說的Python,更多的是指(Python的C語言實現)。它的全稱是CPython。
  • Unladen Swallow項目計劃:提高Python速度5倍
    Google的Python工程師發布了一個新項目,目的是讓Python的速度提高至少5倍。新項目名叫Unladen Swallow,意圖尋找新的Python解釋程序虛擬機,新的JIT編譯引擎。第一季度的目標是實現25-35%的性能提升,目前已經完成,代碼發布在Google Code 網站上。
  • Python 性能優化的20條招數
    ,速度快10倍以上!比 eval 快20多倍。cffi: cffi 的就是 ctypes 在 pypy(詳見下文)中的實現,同進也兼容 CPython。cffi提供了在 python 使用C類庫的方式,可以直接在 python 代碼中編寫C代碼,同時支持連結到已有的C類庫。
  • 20招讓你的 Python 飛起來!
    絕對乾貨,童叟無欺,主要分享了提升 Python 性能的 20 個技巧,教你如何告別慢Python。原文作者 開元,全棧程式設計師,使用 Python, Java, PHP和C++。best of 3: 1.58 ms per loop100 loops, best of 3: 17 ms per loop由c實現的包,速度快10倍以上!
  • 搭上python號小火箭,程序運行越來越快!
    但Python運行的慢是歷來被詬病的,一些人黑Python的一點是Python的程序運行速度奇慢。這一方面和語言有關,另一方面可能就是你代碼的問題。其實,無論使用哪種程式語言,特定程序的運行速度很大程度上都取決於該程序的開發人員及其編寫快而優的程序的技巧和能力。語言方面的問題我們解決不了,所以只能在編程技巧上來提高程序的運行效率。
  • 如何讓Python像Julia一樣快地運行
    包含下面的所有基準測試的完整代碼的 Notebook 可在此處(https://www.ibm.com/developerworks/community/blogs/jfp/resource/julia_python.zip)找到。 鑑於各種社交媒體上的評論,我添加了這樣一句話:我沒有在這裡使用 Python 的替代性實現。我沒有編寫任何 C代碼:如果您不信,可試試尋找分號。
  • Python: 拆分文件讓百萬級數據運行速度提高135倍
    連享會-文本分析與爬蟲專題班,西北工業大學,2020.3.26-29 語言:Python方法:拆分文件目的:提高運行速度具體見我上一篇博文 [百萬級大樣本中的 countif 實現]。特別說明: 文中包含的連結在微信中無法生效。請點擊本文底部左下角的【閱讀原文】。 四、潛在問題雖然按照上一篇文章的思路也能基本完成任務,但是程序運行非常慢,光跑一次統計窗口期公告數據的程序就要27個小時,所以必須優化程序以提高運行速度。
  • 加快程序運行速度只需一行 Python 代碼
    撇開技術上的問題,例如線程的實現和 GIL,我覺得錯誤的教學指導才是主要問題。常見的經典 Python 多線程、多進程教程多顯得偏"重"。而且往往隔靴搔癢,沒有深入探討日常工作中最有用的內容。何不試試 mapmap 這一小巧精緻的函數是簡捷實現 Python 程序並行化的關鍵。map 源於 Lisp 這類函數式程式語言。它可以通過一個序列實現兩個函數之間的映射。
  • 讓 Python 代碼運行更快的最佳方式!
    或者你可以使用Cython,這個項目可以將Python種加上運行時類型信息以便編譯為C,通過這種方式來允許你使用Python代碼。但變通辦法從來都不是理想的。如果我們能夠按原樣使用現有的Python程序並以更快的速度運行它,那不是很好嗎?這正是PyPy允許你做的事情。