python程序的pypy加速

咱們知道,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纔是真正的王道。

相關文章
相關標籤/搜索