5月 09

raspberry pi 测试pypy 切割图片效率

为了方便安装pypy的第三方库,首先安装pip。
$ curl -O http://python-distribute.org/distribute_setup.py
$ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo pypy distribute_setup.py
$ sudo pypy get-pip.py

首先找了一个3M(3072×2304)的图片,缩小为300×300的大小
脚本:

# -*- coding:utf-8 -*-
# -------------------------------
# Filename:    .py
# Revision:    1.0
# Date:        2013-05-08
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------


from PIL import Image


def main():
    get_data = Image.open('test.jpg')
    tmp = get_data.resize((300, 300),)
    tmp.save('test1.jpg', 'JPEG', quality=75)


if __name__ == '__main__':
    main()

在pypy上装PIL
$ sudo /usr/lib/pypy-upstream/bin/pip install PIL

运行脚本报错如下:

File “/usr/lib/pypy-upstream/site-packages/PIL/Image.py”, line 1290, in resize
self.load()
File “/usr/lib/pypy-upstream/site-packages/PIL/ImageFile.py”, line 189, in load
d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
File “/usr/lib/pypy-upstream/site-packages/PIL/Image.py”, line 385, in _getdecoder
raise IOError(“decoder %s not available” % decoder_name)
IOError: decoder jpeg not available

不能调用系统库,之前在处理过这种问题http://www.simonzhang.net/?p=435
但是pypy比较复杂,兼容有问题。直接删除PIL,使用pillow。Pillow基础就是PIL只是兼容性强,更利于推广。
$ sudo /usr/lib/pypy-upstream/bin/pip uninstall PIL

$ sudo /usr/lib/pypy-upstream/bin/pip install pillow

注意必须使用
from PIL import Image

否则会报错
File “/usr/lib/pypy-upstream/site-packages/PIL/Image.py”, line 2020, in open
raise IOError(“cannot identify image file”)
IOError: cannot identify image file

在安装完pillow后没有产生PIL.pth文件,直接手动写一个。
$ sudo vim /usr/lib/pypy-upstream/site-packages/PIL.pth
内容是:PIL。

开始测试

time python cut_pic.py

real 0m2.841s
user 0m2.630s
sys 0m0.200s

time pypy cut_pic.py

real 0m5.144s
user 0m4.870s
sys 0m0.230s

图片产生大小如下
-rw-r–r– 1 pi pi 3588203 5月 8 16:02 test.jpg
-rw-r–r– 1 pi pi 21907 5月 8 16:10 test_pypy.jpg
-rw-r–r– 1 pi pi 21907 5月 8 16:09 test_python.jpg

直接使用python的效果更佳,不清楚原因。之后有版本升级了再做测试。

5月 08

raspberry pi上测试pypy效果

PyPy 2.0 alpha for ARM 发布

官方网页
http://pypy.org/download.html

有专门针对raspberry pi的版本。来简单做个测试。
我这竟还要翻墙下回来。
安装很顺利。
$sudo dpkg -i pypy-upstream_2.0~alpha+arm_armhf.deb

开始测试一下效果,直接到oschina拷贝“ruby太慢的”python版测试一下。

import time
start=time.time()
all=xrange(1,10**7)
def check(num):
    a=list(str(num))
    b=a[::-1]
    if a==b:
        return True
    return False
for i in all:
    if check(i):
        if check(i**2):
            print i,i**2
 
end=time.time()
print end-start

开始测试
直接用python测试
time python test.py
。。。

real 8m13.570s
user 8m3.490s
sys 0m0.560s

使用pypy测试
time pypy test.py
。。。

real 1m45.521s
user 1m44.230s
sys 0m0.150s

结论使用pypy处理运算速度比python高出差不多7倍的效果。

4月 27

tornado 从2.4升级3.0.1遇到的问题

  ”琼台博客”评论tornado3.0.1版本居然没有database。我一直在使用tornado2.4 也打算升级最新版本3.0.1学习一下。
  我先在阿里的云主机上试试。遇到了两个问题。
首先使用easy_install安装到最新版。
#easy_install -U tornado
原有数据库部分代码

from tornado import database

# format  ip, database name, user name, password
db = database.Connection("x.x.x.x","simonzhang","test", "123", 24*3600)

报错
Traceback (most recent call last):
File ““, line 1, in
ImportError: No module named database

  按照”琼台博客”所写安装torndb(直接使用mysqldb-python也可以,但是会有点麻烦)
# easy_install -U torndb
修改代码如下:

import torndb

#torndb.Connection(host, database, user=None, password=None, max_idle_time=25200, connect_timeout=0, time_zone='+0:00'
db = torndb.Connection("x.x.x.x","simonzhang","test", "123", 24*3600)

修改完毕报启动服务器
python main.py 8888
报错如下
socket.error: [Errno 97] Address family not supported by protocol

mail.py的部分代码

if __name__ == "__main__":
    listen_ip =  sys.argv[1]
    application.listen(listen_port)
    tornado.ioloop.IOLoop.instance().start()

应该是因为阿里云主机是两块网卡,eth0是内网,eth1是外网。所以直接也把IP指定

if __name__ == "__main__":
    listen_ip =  sys.argv[1]
    listen_port =  sys.argv[2]
    application.listen(listen_port, listen_ip)
    tornado.ioloop.IOLoop.instance().start()

启动服务
python mail.py x.x.x.x 8888

服务正常启动。