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

2020-12-14 雷鋒網

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 在表中),但我在運行中並沒有遇到任何問題。

這就是我怎麼做的:

安裝: % 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

102400 10000 1.76131296158

102400 10000 1.83870100975

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 程序:

% python < myfftprog.py

fft

5000 2.22796392441

7000 8.74916005135

5000 0.277629137039

7000 1.11230897903

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

這是我的快速 FFT 程序:

% cat myfftprog.py

import numpy.random as rn

def trythis(Z):

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

print 'fft'

# 2D transform on a complex-valued matrix:

result = np.fft.fft2(mat)

print Z, end - start

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 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。James ReindersJames Reinders:利用 Intel Distribution for Python,我實現了 Python 的 20 倍加速,並且可用單個命令關閉/啟用。
  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速! 至於他是怎麼做到的,請繼續往下看(含代碼)。
  • 酷睿i5性能這樣瞬間提升20倍!
    他對外宣布:在配備四核i5的iMac上實現了20倍的性能加速,至於他是怎麼做到的,請繼續往下看(含代碼)。ames Reinders:利用Intel Distribution for Python,我實現了 Python 的20倍加速,並且可用單個命令關閉/啟用。
  • 一行代碼讓你的Python運行速度提高100倍!Python真強!
    Python用的好,豬也能飛起來。今天,帶大家學習如何讓Python飛起來的方法,乾貨滿滿哦!python一直被病垢運行速度太慢,但是實際上python的執行效率並不慢,慢的是python用的解釋器Cpython運行效率太差。「一行代碼讓python的運行速度提高100倍」這絕不是譁眾取寵的論調。我們來看一下這個最簡單的例子,從1一直累加到1億。
  • 代碼詳解:如何用Python運行高性能的數學範式?
    全文共1140字,預計學習時長3分鐘比較python中不同運行範式的表現情況對於以性能為核心的應用程式和數據處理通道來講,需要運行最佳範例並選擇正確的庫集。那麼,在開發和學習中有哪些技巧呢?首先需要明確的是:編寫python代碼和編寫pythonic代碼之間存在很大差異。
  • 入門 | 三行Python代碼,讓數據預處理速度提高2到6倍
    在當前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時候,這種情況會變得更加明顯。幸運的是,Python 庫中內建了一些隱藏的特性,可以讓我們充分利用所有 CPU 核心的能力。通過使用 Python 的 concurrent.futures 模塊,我們只需要 3 行代碼就可以讓一個普通的程序轉換成適用於多核處理器並行處理的程序。
  • 三行Python代碼,讓數據處理速度提高2到6倍
    在當前四核處理器(英特爾酷睿 i5)和 6 核處理器(英特爾酷睿 i7)大行其道的時候,這種情況會變得更加明顯。使用 for 循環逐個處理每個數據,然後在每個循環迭代上運行預處理。讓我們在一個包含 1000 個 jpeg 文件的文件夾上測試這個程序,看看運行它需要多久:time python standard_res_conversion.py在我的酷睿 i7-8700k 6 核 CPU 上,運行時間為 7.9864 秒!
  • 如何用iPad運行Python代碼?
    因為只挑瀏覽器,不挑作業系統,所以別說你用Windows 10,你就是用iPad,都能運行代碼。嘗試請你打開瀏覽器,輸入這個連結(http://t.cn/R35fElv)。看看會發生什麼?我這裡用iPad給你演示。一開始會有個啟動界面出來。請你稍等10幾秒鐘。
  • 一個簡單的更改讓PyTorch讀取表格數據的速度提高20倍
    我將向您展示我在PyTorch中對表格的數據加載器進行的簡單更改如何將訓練速度提高了20倍以上,而循環沒有任何變化! 這只是PyTorch標準數據加載器的簡單替代品。 對於我正在訓練的模型,可以16分鐘的迭代時間,減少到40秒!所有這些都無需安裝任何新軟體包,不用進行任何底層代碼或任何超參數的更改。
  • Python日課-2.5-python語言的不同實現
    Python 日課 2021-01-14:Python語言的不同實現。各位同學,今天來說說Python語言的種類吧。CPythonhttps://python.org我們平時說的Python,更多的是指(Python的C語言實現)。它的全稱是CPython。
  • 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倍以上!
  • Unladen Swallow項目計劃:提高Python速度5倍
    Google的Python工程師發布了一個新項目,目的是讓Python的速度提高至少5倍。新項目名叫Unladen Swallow,意圖尋找新的Python解釋程序虛擬機,新的JIT編譯引擎。第一季度的目標是實現25-35%的性能提升,目前已經完成,代碼發布在Google Code 網站上。
  • 讓Python代碼更快運行的 5 種方法
    選擇了腳本語言就要忍受其速度,這句話在某種程度上說明了Python作為腳本語言的不足之處,那就是執行效率和性能不夠亮。儘管Python從未如C和Java一般快速,但是不少Python項目都處於開發語言領先位置。Python很簡單易用,但大多數人使用Python都知道在處理密集型cpu工作時,它的數量級依然低於C、Java和JavaScript。
  • 加快程序運行速度只需一行 Python 代碼
    撇開技術上的問題,例如線程的實現和 GIL,我覺得錯誤的教學指導才是主要問題。常見的經典 Python 多線程、多進程教程多顯得偏"重"。而且往往隔靴搔癢,沒有深入探討日常工作中最有用的內容。我並不是說使用生產者/消費者模型處理多線程/多進程任務是錯誤的(事實上,這一模型自有其用武之地)。只是,處理日常腳本任務時我們可以使用更有效率的模型。
  • 讓 Python 代碼運行更快的最佳方式!
    或者你可以使用Cython,這個項目可以將Python種加上運行時類型信息以便編譯為C,通過這種方式來允許你使用Python代碼。但變通辦法從來都不是理想的。如果我們能夠按原樣使用現有的Python程序並以更快的速度運行它,那不是很好嗎?這正是PyPy允許你做的事情。
  • 慢步python,如何用python語言創造出一個真正的獨立exe程序?
    獨立的應用程式應該像QQ,微信一樣不依靠其他程序運行,只有平臺支持,就可以運行。從這個意義上說,所用應用程式都是基於作業系統運行的。那麼如何用python語言創造出一個真正的獨立的應用程式?就是我們電腦上的exe程序?
  • 20-python高級篇-如何實現client和server間的通信
    我們通過昨天的文章19-python高級篇-http,socket和tcp的關係認識了http,socket和tcp三者之間的區別和聯繫,今天我們將學習如何實現client和server間的通信。(一)socket編程流程    每一個應用程式佔用一個埠,埠號唯一。socket編程中需要首先綁定協議,地址和埠。
  • 用這幾個方法提高pandas運行速度
    pandas是基於numpy庫的數組結構上構建的,並且它的很多操作都是(通過numpy或者pandas自身由Cpython實現並編譯成C的擴展模塊)在C語言中實現的。因此,如果正確使用pandas的話,它的運行速度應該是非常快的。本篇將要介紹幾種pandas中常用到的方法,對於這些方法使用存在哪些需要注意的問題,以及如何對它們進行速度提升。
  • Python2.6低版本Python如何實現爬蟲功能
    之前我在文章中實現了用requests庫爬取騰訊疫情數據的功能。但是我再Linux伺服器上運行那個程序卻出現了意想不到的情況。運行結果Python 2.6.6 (r266:84292, Jun 20 2019, 14:14:55)[GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux2Type "help", "copyright", "credits" or "license" for more information.