前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python程序的pypy加速

python程序的pypy加速

作者头像
钱塘小甲子
发布2019-01-28 10:28:01
1K0
发布2019-01-28 10:28:01
举报

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

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

今天主要讲一讲pypy。

我们先来看一个例子:

代码语言:javascript
复制
#!/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写的还快。

实在是太好用了!

于是,我们继续写一个:

代码语言:javascript
复制
#!/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才是真正的王道。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年09月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档