如何在 i5 上实现 20 倍的 Python 运行速度?

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 在表中),但我在运行中并没有遇到任何问题。

这就是我怎么做的:

  1. 下载 Anaconda 命令行安装程序,地址为 https://www.continuum.io/downloads 。
  2. 安装: % bash Anaconda2-4.3.0-Linux-x86_64.sh
  3. 安装英特尔加速器,作为一个单独的、可开启关闭的“环境”:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2
  4. 运行示例程序,看到在我的 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 加速:

  1. 利用多核;
  2. 利用矢量指令(SIMD),比如 SSE, AVX, AVX2 和 AVX-512;
  3. 使用英特尔 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 把它开启/关闭这一功能。这方便了性能对比,并且让我感到安心——没有这个功能的话,我会对切换到超快的数学函数感到犹豫。

本文作者:三川

本文转自雷锋网禁止二次转载,原文链接

时间: 2024-11-01 16:50:02

如何在 i5 上实现 20 倍的 Python 运行速度?的相关文章

如何在SNS上创造价值

新浪微博上到处都充斥着消费品的的软广告.卖糕点的啊.各种团购网和服饰网站的最新动态.企业们正在摸索着如何在SNS上做这些推广.用SNS创建新的品牌,最成功的当属中粮旗下的悦活果汁了,凭借开心网的小游戏,瞬间就风靡了大江南北. 在国外,在SNS上建立的消费品牌,是每家企业都必须关注的课题.随着公司不断的聚集大批的Facebook粉丝.Twitter关注者和YouTube观众,他们应该问自己这样的一个问题:我们正在这些社交媒体上做什么呢? 实际上,在SNS上仅仅创造一些流行词汇对企业来说算不上具有商

如何在SNS上推广消费品牌

一些小窍门,可以让企业在SNS上事半功倍. 作者:Ben Paynter 编译:张林 新浪微博(http://t.sina.com.cn)上到处都充斥着消费品的软广告,卖糕点的.各种团购网以及服饰网站的最新动态,企业们正在摸索如何在SNS上做推广.用SNS创建新品牌,最成功的当属中粮旗下的悦活果汁,凭着开心网的小游戏,瞬间就风靡大江南北. 在国外,在SNS上建立消费品牌,是每家企业都不得不关注的课题.随着公司不断地聚集大批的Facebook粉丝.Twitter关注者以及YouTube观众,他们应

Grabit机器人制造耐克鞋的效率为人类20倍,背后的原理究竟是如何?

不曾想象,生产一双Nike鞋子最劳动密集型的工序,莫过于缝制位于我们双脚上面最柔软的鞋面部分.我们日常看到的普通运动鞋从表面上看,鞋面像由一整块完整的材料组构而成,没有明显的缝纫痕迹,但事实上,鞋厂工人用了40件材料叠加在一起加热并熔合,才制成了我们运动鞋的鞋面.由于工序过于复杂,所以一直由工人制作完成.而如今,机器人将能够代替劳动工人去完成生产工序中这最复杂的一步. 雷锋网(公众号:雷锋网)获悉,早在四年前,Nike耐克投资了一家初创公司Grabit,其总部位于加州桑尼维尔的初创公司Grabi

阿里云首次披露CDN增速 比传统厂商快20倍

3月18日,阿里云发布极速CDN 6.0版,在业界首次提出Cloud Delivery Network(云分发网络)理念.新版CDN融合云计算和大数据技术,涵盖视频和移动两个解决方案以及大数据分析.HTTPS加速等新功能,为客户提供一站式的云CDN解决方案. 与此同时,阿里云也透露2015年云CDN客户数已突破10万,客户规模是传统CDN厂商客户之和的20倍:营收同比增长800%,增速比传统服务商增速快约20倍. 这是继去年率先让利引发行业震动之后,阿里云再次以新的技术和产品引导行业变革,为客户

一次性工亡补助金调为人均收入20倍

本报讯 (记者 孙乾) 昨天,国务院常务会议决定对<工伤保险条例>相关条文作出修改.修改后的条例草案扩大了工伤认定范围,提高了一次性工亡补助金和一次性伤残补助金标准.一次性工亡补助金标准调整为上一年度全国城镇居民人均可支配收入的20倍. <工伤保险条例>自2004年1月施行.此次召开的国务院常务会议针对工伤保险制度面临的新情况.新问题,作出相关修改.修改后的条例草案从维护职工合法权益出发,完善了有关制度. 修改后的草案扩大了工伤保险适用范围,除现行规定的企业和有雇工的个体工商户以外

阿里云SSD云盘第二轮公测 性能提升20倍

本文讲的是阿里云SSD云盘第二轮公测 性能提升20倍6月9日,阿里云开启了"大杀器"SSD云盘的第二轮公测,其IOPS提升到了20000,是当前云盘性能的20倍.同时,盘内数据全部实时落盘,可靠性9个9.尤其适合中大型关系数据库.核心业务系统以及中大型开发测试环境使用.SSD云盘已在杭州地域公测,公测期至7月15日免费使用. IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一,一个普通的7200转的家用磁盘的IOPS

LinkedIn用Node替代Rails:减少了27台服务器 速度提升20倍

Ryan http://www.aliyun.com/zixun/aggregation/13830.html">Paul写过一篇<深入观察LinkedIn移动端的设计>,在其中我们看到:有23%的移动用户:专注朴素.易用以及可靠性:30%原生代码,70%使用HTML:嵌入轻量的HTTP服务:单一的客户端应用链接云服务器:后端服务从Rails转换到Node.js. 曾经在LinkedIn工作的工程师蓝奕凯补充道:移动促使产生了跨数据中心应用.运行在单线程的Rails服务器上(每

如何在linux上构建objective-c程序

    swfit目前还是os x独占,以后会不会扩展到其他系统还未可知,但objective-c并不只存在于os x,在linux下gcc和clang都支持obj-c哦,下面简单把如何在ubuntu上构建obj-c做一下说明: 1 安装obj-c或obj-c++(如果需要的话)所需库:   * build-essential     * gobjc     * gobjc++     * gnustep-devel  直接用apt-get install 搞定吧 :) 2 用经典的hello

平均提速20倍!Oracle 12c In-Memory最佳实践

一.IM特性简介   Oracle 12.1.0.2 引入了In-Memory Column Store(以下简称IM)新特性,该特性开启后会在数据库启动阶段在SGA中分配一块静态的内存池In-Memory Area,用于存放以列式存储的用户表.   列式存储的优点是在访问数据时只需要访问数据的部分列,而不像行式存储,需要访问数据的所有列.列式存储可以避免大量不必要I/O,且每一列的列值即为索引,可以显著提高查询性能.   IM列式存储并不会替换传统的buffer cache行式存储,而是作为补