我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比。最近在些一些代码的时候也是碰到了这样的问题。

具体而言,python想提速度,基本思路是两个,有个就jit技术,在python中比较好用的就是pypy;另外一种就是先分析代码速度瓶颈,然后把性能瓶颈用c或者别的语言写成模块,让python调用。后面一种方法其实也存在折中,比如cython。对于cython,笔者目前也在学习中,后续有心得了,写成文章和大家分享。

今天主要讲一讲pypy。

我们先来看一个例子:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import time
def list_function():
list_1 = range(100000)
list_2 = range(100000)
result_list = list()
for cnt in range(100):
for (a, b) in zip(list_1, list_2):
result_list.append(a + b)

return sum(result_list)

start = time.time()

print list_function()
print 'time elapse', time.time() - start
这段代码很简单,反正测试用。

然后首先在命令行中用python命令执行一下,看一下花费了多少时间:

大概在三秒半左右,大家运行的时间可能会不一样,毕竟笔者的笔记本已经有点年纪了,但我还是很爱我的笔记本。

然后我们换一个命令来运行,pypy

surprise,什么都没做,速度就快了一倍还要多,于是有人就说,这个东西真好用。这就是JIT的力量,有人说,有些代码,pypy可以做到比c写的还快。

实在是太好用了!

于是,我们继续写一个:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import time
import pandas as pd

def list_function():
list_1 = range(100000)
list_2 = range(100000)
result_list = list()
for cnt in range(100):
for (a, b) in zip(list_1, list_2):
result_list.append(a + b)

return sum(result_list)

def df_function():
df = pd.DataFrame()
df['a'] = range(100000)
df['b'] = range(100000)
accu = 0
for cnt in range(100):
accu += sum(df['a'] + df['b'])
return accu

start = time.time()

print list_function()
print df_function()
print 'time elapse', time.time() - start
       在命令行中用python运行:

大概5.5秒不到一点点的样子。然后我们想到了厉害的pypy。看一下效果吧:

很遗憾,由于我们使用了pandas这一第三方包,所以不能用jit,也就是不能用pypy了,除非我们去下一个支持jit的pandas的包。换句话说,如果你写的python程序只包含build_in函数的话,那么很开心,pypy可以很好的加速,但是通常情况下并不是这样的,我能会用到各种各样的库。那怎么办,为了使用pypy而牺牲python最大的优点,第三方库,似乎有点舍本逐末了,还不如直接用cpp呢!

其实有一个叫jitpy的东西,据说可以用,但是。。好像最近网被墙了。。后续可以了再写一个。

当然,其实pypy也是可以自己安装包的,只是第一包不多,第二版本比较老,而且。。安装往往会出问题。或者cython才是真正的王道。

---------------------
作者:钱塘小甲子
来源:CSDN
原文:https://blog.csdn.net/qtlyx/article/details/78078636
版权声明:本文为博主原创文章,转载请附上博文链接!

python程序的pypy加速的更多相关文章

  1. 用Cython加速Python程序以及包装C程序简单测试

    用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...

  2. 使用numba加速python程序

    前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即 ...

  3. python笔记:#002#第一个python程序

    第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3​​.x 版本简介 执行 Python 程序的三种方式 解释器 -- python / python ...

  4. 第一个 Python 程序

    ## 目标 * 第一个 `HelloPython` 程序* `Python 2.x` 与 `3​​.x` 版本简介* 执行 `Python` 程序的三种方式 * 解释器 —— `python` / ` ...

  5. 人生苦短之---第一个Python程序

    第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3​​.x 版本简介 执行 Python 程序的三种方式 解释器 —— python / python ...

  6. 谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  7. Python学习札记(二) python3.5安装 + (假装是)第一个Python程序

    参考: Mac OS 安装 Python3.5 廖雪峰Python教程:安装Python 笔记: 安装: 1.官方网站下载安装包:安装程序 2.执行安装程序完成Python3.5包的安装. 3.安装P ...

  8. Python 开篇及第一个Python程序

    本节内容 python 简单介绍 python 2.x 或者python 3.x python 安装 第一个python程序 一.python简单介绍 python的创始人为吉多.范罗苏姆(Guido ...

  9. python程序的编辑和运行、变量

    第一个python程序 python是解释型弱类型高级语言 常见的python解释器CPython.IPython.pypy.JPython.IronPython 方法一.python程序可以写在命令 ...

随机推荐

  1. 怎样用命令行管理SharePoint Feature?

    普通情况下对IT管理者来说.在SharePoint Farm中维护Feature,更喜欢使用命令行实现,这样能够省去登录到详细网站的操作. 比方IT接到end user的一个需求,要开启Site Co ...

  2. 免费DNSserver有哪些?

    DNS 是上网中极其重要的一环,因为电脑仅仅认识数字组成的 IP 地址,人们发明了域名来帮助记忆 (如 iPlaySoft.com),因此,在訪问不论什么域名时.背后都须要一台 DNS server来 ...

  3. Odoo 运费

    模块delievery可以将运费Charge给客户     安装delivery模块                 Delivery method     在做订单的时候,选择相应的运输方法, 系统 ...

  4. 转:Hadoop和Spark的异同

    转自:http://www.techweb.com.cn/network/system/2016-01-25/2267414.shtml 谈到大数据,相信大家对Hadoop和Apache Spark这 ...

  5. mysql生产环境____主从同步修复案例

    一.   硬件环境 Master: Dell R720 Intel(R)Xeon(R) CPU E5-2640 v2 @ 2.00GHz MEM 64G.disk 4*2.5 SAS  网络4* 千兆 ...

  6. MySQL数据导入与导出

    http://blog.chinaunix.net/uid-23354495-id-3188029.html     mysql备份脚本之select into outfile

  7. 最简单的基于FFmpeg的移动端样例附件:SDL Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  8. Linux驱动经典面试题目

    1.  linux驱动分类 2.  信号量与自旋锁 3.  platform总线设备及总线设备怎样编写 4.  kmalloc和vmalloc的差别 5.  module_init的级别 6.  加入 ...

  9. 按照HashMap中value值进行排序

    import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  10. mongodb查看连接数、同步时间、oplog及修改表名的操作

    1) mongodb查看连接数: db.serverStatus().connections; 2) mongodb查看同步时间: db.printSlaveReplicationInfo();  % ...