咱们知道,python做为一种几乎是脚本语言的语言,其优势当然有,可是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比。最近在些一些代码的时候也是碰到了这样的问题。java
具体而言,python想提速度,基本思路是两个,有个就jit技术,在python中比较好用的就是pypy;另一种就是先分析代码速度瓶颈,而后把性能瓶颈用c或者别的语言写成模块,让python调用。后面一种方法其实也存在折中,好比cython。对于cython,笔者目前也在学习中,后续有心得了,写成文章和你们分享。python
今天主要讲一讲pypy。c++
咱们先来看一个例子:app
#!/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写的还快。ui
实在是太好用了!.net
因而,咱们继续写一个:
#!/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才是真正的王道。