用技术创造价值,用艺术塑造自我!
Posts tagged python
MongoDB在Ubuntu10.04下的单机性能测试
Aug 31st
MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。它比纯noSQL数据库查询功能强悍,比关系数据库更面向集合。
测试的硬件:酷睿双核3.0G,2G内存,7200转普通硬盘,Ubuntu10.04 32bit,MongoDB1.61
安装&启动
longhao@aliyun:~$ sudo apt-get install mongodb
#添加一个so,否则启动不了mongodb
longhao@aliyun:~$ sudo ln -s /usr/lib/xulrunner-devel-1.9.2.8/lib/libmozjs.so /usr/lib/libmozjs.so
#启动
longhao@aliyun:~$ sudo service mongodb start
安装python库
到github上去下载mongodb到python driver或者 git clone git://github.com/mongodb/mongo-python-driver.git pymongo
longhao@aliyun:~$ tar zxvf pymongo.*.tar.gz
longhao@aliyun:~$ cd pymongo
longhao@aliyun:~$ python setup.py install
编写测试代码
#!/usr/bin/env python
from pymongo import Connection
import time,datetime
connection = Connection('127.0.0.1', 27017)
db = connection['testdb']
'''
test program execute time,use python decorator!
'''
def func_time(func):
def _wrapper(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
print func.__name__,'run:',time.time()-start
return _wrapper
@func_time
def insert(num):
posts = db.posts
for x in range(num):
post = {"author": str(x)+"Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts.insert(post)
@func_time
def find():
posts = db.posts
print posts.find_one()
@func_time
def remove():
posts = db.posts
print 'count before remove:',posts.count();
posts.remove({});
print 'count after remove:',posts.count();
if __name__ == "__main__":
num = 1000000
insert(num)
find()
remove()
测试结果
longhao@aliyun:~$ python mongodb.py
insert run: 211.037979126
{u'date': datetime.datetime(2010, 8, 31, 12, 59, 30, 456000), u'text': u'My first blog post!', u'_id': ObjectId('4c7cfcb28cb52a3eec00002e'), u'author': u'46Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
find run: 0.0865120887756
count before remove: 1000000
count after remove: 0
remove run: 9.01437902451
测试显示向数据库中插入100W条数据耗时211.038秒,删除100W条数据耗时9.014秒,数据库文件总大小为1G(这个和保持的对象大小有关系)
遇到到问题:
1:数据库文件大小在清空库后不能自动更改;
2:单线程测试的结果,多线程效率会怎样还需要测试!
Ken Thompson的经典命题:输出自身源代码的程序(c,python,java)
May 11th
Ken Thompson(C语言和Unix的发明者之一,目前在google搞go语言)在获得图灵奖的演说中提到:读大学的时候他曾经写出一个输出自身代码的程序(没有游戏的时代就只能玩YY了,自己出题自己做)。那个时候还没有C,python,java,实现这个问题的难度在于引用和字符串,当然也有多种经典的解法。
C语言
经典的例子 (应该以一行表示的, 虽然第一次执行后它后自我 修复):
main(){printf(s,34,s,34);}
这段程序有一些依赖, 忽略了 #include <stdio.h>, 还假设了双引号 " 的值为 34, 和 ASCII 中的值一样。
还有一个由 James Hu 发布的改进版:
q(#define q(k)main(){return!puts(#k"\nq("#k")");})
Python版本
解法一:
print 'a = ', repr(a), '\n', repr(a)[1:-5]
解法二:
print 'a = ', a, '\n', ''.join(a)
Java版本
应该考虑在一行搞定,去掉包的申明,这样实现起来就简单多了。
其他语言实现起来应该也很简单,大家可以尝试用不同语言继续实现。例如:C#,ruby,C++等等。
Python配置文件部署自动更新脚本教程
Mar 31st
系统中存在配置文件几乎是没有悬念的事情,每次系统升级,手动修改配置文件是一件让人非常头痛的事情,既然计算机能够自动搞定这些事情,为什么人工还要干预呢?所以写个脚本来批量处理这个事情。
需求分析
- 新添加的配置能够自动添加到生成环境中去,删除的配置能够自动从生成环境删除;
- 对新添加的配置能够展示给用户,当用户输入某行行号后,能够修改配置到生产环境。
用shell脚本写出第一版的程序,发现对空的判断(行内多个空格,空行)无法解决,所以还是用python来实现需求。
实现的过程
1:把*.properties文件内容转化为Dictionary,供后续校对2个文件使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def readFile(name): propFile= file(name, "rb") propDict= dict() for propLine in propFile: propDef= propLine.strip() if len(propDef) == 0: continue if propDef[0] in ( '!', '#' ): continue punctuation= [ propDef.find(c) for c in ':= ' ] + [ len(propDef) ] found= min( [ pos for pos in punctuation if pos != -1 ] ) name= propDef[:found].rstrip() value= propDef[found:].lstrip(":= ").rstrip() propDict[name]= value propFile.close() return propDict |
2:把生产环境A中没有,但是开发配置B中有的配置添加到A中去,同时把添加的内容放到一个Dictionary中,让后续输入行号可以修改改内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def diffFile(baseFile,serverFile,diffPrintFlag): myFile1 = readFile(baseFile) #base file myFile2 = readFile(serverFile) #the file on server f = open(serverFile,"ab") global count for key in myFile1: value = myFile1.get(key) value2 = myFile2.get(key) #property nedd add to server file if(value != "" and not value2): print str(count) + ": " + key + "=" + value f.write("\r\n" + key + "=" + value) dictGolable[str(count)] = key count += 1 if(value2 != value and diffPrintFlag): print "base properties:",key,"=",value,"\t","server properties:",key,"=",value2,"\n" else: pass f.close |
3:删除生产环境A中有,但是开发配置B没有的配置
1 2 3 4 5 6 | for key in myFile2: value = myFile1.get(key) value2 = myFile2.get(key) #property already delete deal; if(value2 != "" and not value): replaceFile(serverFile,key+"="+value2,"") |
4:在删除生产环境A中内容的时候需要一个公用方法:
1 2 3 4 | def replaceFile(inputFile,old,new): data = open(inputFile).read() data = re.sub(old,new, data) open(inputFile, 'wb').write(data) |
5:手工输入行号,能够把前面添加的配置的value修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | def add2File(serverFile): flag = True server = readFile(serverFile) if(count <= 1): flag = False else: print 'press n to exsit!' while(flag): num = raw_input("which row do you want do modify:") try: if(num == 'n' or num == 'N'): flag = False break key = dictGolable[str(num)] except KeyError: print 'error input!' continue if(not key): print 'input wrong,need to reinput:' continue oldVlaue = server.get(key) print 'input value: ',key+"=", value = raw_input('') replaceFile(serverFile,key+"="+oldVlaue,key+"="+value) |
当然在这个过程中会碰到KeyError的问题,注意try except一下。
6:unix下面的换行和dos下面的表示有区别,当在linux下面出现^M的时候,需要用代码来处理:
1 | os.system("sed -i'' \"s/\r//\" "+serverFile) |
源码下载
Django1.0的Model模块笔记(上)
May 16th
由于Django1.0相对以前版本改动较大,原来网上的翻译文档基本过时了,不得不到官方网站上一边看文档,一边记笔记,以方便自己以后有什么不懂的地方自己查阅。由于文字过多,就不贴到blog上了。只提供下载。django的初学者们,猛烈点击这里下载吧!
简介一下:模型是单一的,明确你数据数据源。它包括用户存储的基本领域和行为,简单的说,一个模型就映射到一个数据库的表。
1:每个模型是一个python类django.db.models.Model.的子类;
2:每个属性映射到数据库表的一个字段;
3:通过这些,Django给了一个自动生成数据库访问的API,
PS:在django的安装目录的tests/modeltests目录中有相关的model模块的测试代码,可以找到很多你想要的例子。
第一个可以运行的django的例子
Mar 21st
在启动django后,你现在肯定想自己写一段代码来在浏览器中展示,我们就用一个简单的例子说明一下相关的配置和如何写简单的代码。Web框架一般都实现了MVC(Model-View-Controller),当然我们现在还没有涉及到相关的内容,首先我们需要做的是在view层显示我们的程序的运行结果。
动态的内容放在视图的运行
首先你需要把自己的应用放到自己的python patch的任何目录下面,当然,你可以自己设置一下python path,让你可以放置到自己喜欢的位置。代码中设置的方法如下:(在django中设置Python PATH是manage.py的一个工作 )
import sys
sys.path.append("e:/python/webapp")
在系统环境变量中添加DJANGO_SETTINGS_MODULE变量,将其值设置为mysite.settings 添加PYTHONPATH:C:\\python25\\DLLs;E:\python\web\myqbox(E:\python\web\myqbox为python project的工作目录,存放project, mysite是一个project目录,seetings为她的设置模块)重新启动一个cmd,进入python。
在你的目录下面建一个文件views.py。代码内容是:
1 2 3 | from django.http import * HttpResponsedef helloworld(request): return HttpResponse("Hello, World!") |
配置你的URL
django-admin.py startproject会自动生成一个URL配置文件urls.py,默认情况下它是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | django-admin.py startproject会自动生成一个URL配置文件urls.py,默认情况下它是这样的: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^myqbox/', include('myqbox.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # (r'^admin/(.*)', admin.site.root), ) |
让我们编辑urls.py来关联helloworld视图,需要加入的配置信息是:
from myqbox.views import helloworld
……
(r’^hello/$’, helloworld),
这个配置用到了python的正则表达式,对正则表达式不熟悉的同学需要好好的温习一下。在python中总是把url展示出来尽量的优雅一点,所以django能够让我们配制出自己希望展示的url,不像java的struts框架,所有的信息都是用.do或者是.action带上一堆的参数来完成的。当然在java中也有urlrewrite这个包可以帮你解决这个问题,总体来说不是很方便。
在浏览器中键入http://127.0.0.1:8000/hello/访问你的页面,看看是否打印出helloworld!如果打印争取就先恭喜你一下,如果失败,请查看日志排除错误,多数情况下都是python path出了问题。
Django怎样处理Web过程
1,执行python manage.py runserver寻找settings.py,这个文件包含了这个Django实例的所有配置选项。最重要的设置是ROOT_URLCONF,它告诉Django使用哪个Python模块作为当前站点的URL配置
2,当一个请求进来如/hello/,Django载入URL配置,然后按顺序检查每个URL模式直到找到一个匹配的URL请求模式。然后Django调用那个模式匹配的方法,并传递一个HttpRequest对象作为第一个参数
3,视图方法负责返回一个HttpResponse对象
———-可以打印出所有汉字的python代码—————————————————————-
1 2 3 4 5 6 7 8 | n=0 for ch in xrange(0x4e00, 0x9fa6): print unichr(ch), n = n+1 if(n%50==0): print '\n' print n |
Python Web框架Django的开始之旅–Runnable
Mar 15th
Django是简介:
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的设计模式,即模型M,模版T和视图控制器V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。更多信息在这里
Django安装
安装Django之间你必须安装python,到python.org(千万别到python.com上,别怪我没有告诉你)上去下载2.3以上,3.0以下的版本(3.x的版本不向下兼容,目前django还不支持)。到http://www.djangoproject.com/download/下载最新的django1.0.2的gz包,
在linux下的安装为:
1:tar xzvf Django-1.0.2-final.tar.gz
2:cd Django-1.0.2-final
3:sudo python setup.py install
在windows下面的安装方式为:
1:进入命令行;转到django的解压缩目录
2:输入:C:\Python25\python.exe setup.py install 就可以了,这里的python.exe是自己的的python在windows下的安装目录。
开发前准备工作
1:django支持的数据库
在web开发之旅中,摆脱数据库总是不太现实,所以需要了解一下django支持的数据库,目前django支持5中数据库:Oracle,MySQL ,PostgreSQL ,SQLite 3 ,Microsoft SQL Server
Oracle和Django的结合
目前支持oracle 9i以上的版本,你需要到http://cx-oracle.sourceforge.net/下载cx-oracle包来提供相关的支持。
Mysql和Django的结合
支持Mysql4.0以上的版本,需要到http://sourceforge.net/projects/mysql-python下载mysql-python包。
其他数据库工作中很少关注,如果想继续关注请google一下。
2:web服务器的安装
(1)到www.modpython.org下载mod_python包,安装中会自动找到你的python安装目录和apache的安装目录,如果提示没有找到,就需要你选择一下相关的安装目录,如果错误会自动退出安装。
(2)在apache的httpd.conf中添加相关的配置:
在<IfModule alias_module></IfModule> 中间添加相关的配置,注意你的apache的版本号对应的相关的配置。
LoadModule python_module modules/mod_python.so
<Directory "E:/python/web">
Options FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
Satisfy all
AddHandler mod_python .py
PythonHandler test
PythonDebug On
</Directory>
(3)测试一下你的服务器,在目录E:/python/web下面新建test.py,内容如下:
from mod_python import apache
1 2 3 | def handler(req): req.write("Hello World!") return apache.OK |
启动apache服务器,在浏览器中输入http://localhost/python/test.py,现实Hello World!则代表服务器启动了。
开始django之旅
(1)到django的安装目录(C:\Python25\Lib\site-packages\django\bin),执行C:/Python25/python.exe django-admin.py startproject mydjango 然后在安装目录下面会有4个文件,分别是:__init__.py (可以向Python编译器表明当前文件夹下的内容是Python工程模块) ;manage.py (一个命令行工具,可以让你以多种方式与Django项目交互);setting.py (Django项目的配置 );urls.py (负责配置URL的地址映射以及管理URL的地址格式 )Python代码不要放在document root下 ,因为这样做别人可以从Web看到你的代码;把代码放在document root以外的目录,如/opt/mydjango。
(2)在命令模式下执行:
C:\Python25\Lib\site-packages\django\bin>cd mydjango
C:\Python25\Lib\site-packages\django\bin\mydjango>C:/Python25/python.exe manage.py runserver
Validating models…
0 errors found
Django version 1.0.2 final, using settings ‘mydjango.settings’
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
在浏览器中看到相关的内容,就说明启动了Django应用服务器,如果你的代码有改动,它自动reload,不需要重启项目。默认情况下runserver命令启动服务器的端口为8000,只监听本地连接
如果你希望改变端口,增加一个命令行参数即可:
C:/Python25/python.exe manage.py runserver 8080
你也可以改变服务器监听的IP地址:
C:/Python25/python.exe manage.py runserver 0.0.0.0:8080
后面你就可以自己写python的代码。
推荐2本django的电子书籍
1:django step by step
2:The Django Book 中文版翻译在这里
如果你python还没有学习的话,请买本《python核心编程第二版》读读吧!
配置过程中可能的问题
1:在windows的命令模式下执行 python 报错:
计算机的属性》高级》计算机环境变量》path中添加C:\Python25(python安装目录)
2:403错误,查找apache下面的error日志:
client denied by server configuration
apache2.0和2.2的配置文件不一样。
2.0:
Options FollowSymLinks
AllowOverride None
2.2:
Options FollowSymLinks
AllowOverride None
Order allow,deny
Deny from all 这个地方需要修改为allow from all
Satisfy all

