python环境测试MySQLdb、DBUtil、sqlobject性能

首先介绍下MySQLdb、DBUtil、sqlobject:

(1)MySQLdb 是用于Python连接Mysql数据库的接口,它实现了 Python 数据库
API 规范 V2.0,基于 MySQL C API 上建立的。除了MySQLdb外,python还可以通过oursql, PyMySQL, myconnpy等模块实现MySQL数据库操作;

(2)DBUtil中提供了几种连接池,用以提高数据库的访问性能,例如PooledDB,PesistentDB等

(3)sqlobject可以实现数据库ORM映射的第三方模块,可以以对象、实例的方式轻松操作数据库中记录。

为测试这三者的性能,简单做一个例子:50个并发访问4000条记录的单表,数据库记录如下:

测试代码如下:

1、MySQLdb的代码如下,其中在connDB()中把连接池相关代码暂时做了一个注释,去掉这个注释既可以使用连接池来创建数据库连接:

(1)DBOperator.py

01 import MySQLdb
02 from stockmining.stocks.setting import LoggerFactory
03 import connectionpool
04  
05 class DBOperator(object):
06      
07     def __init__(self):
08         self.logger = LoggerFactory.getLogger('DBOperator')
09         self.conn = None
10                
11     def connDB(self):
12         self.conn=MySQLdb.connect(host="127.0.0.1",user="root",passwd="root",db="pystock",port=3307,charset="utf8")  
13         #当需要使用连接池的时候开启
14         #self.conn=connectionpool.pool.connection()
15         return self.conn
16  
17     def closeDB(self):
18         if(self.conn != None):
19             self.conn.close()  
20    
21     def execute(self, sql):
22         try:
23             if(self.conn != None):
24                 cursor = self.conn.cursor()
25             else:
26                 raise MySQLdb.Error('No connection')
27              
28             = cursor.execute(sql)
29             return n
30         except MySQLdb.Error,e:
31             self.logger.error("Mysql Error %d: %s" % (e.args[0], e.args[1]))
32   
33     def findBySQL(self, sql):
34         try:
35             if(self.conn != None):
36                 cursor = self.conn.cursor()
37             else:
38                 raise MySQLdb.Error('No connection')
39              
40             cursor.execute(sql)
41             rows = cursor.fetchall() 
42             return rows
43         except MySQLdb.Error,e:
44             self.logger.error("Mysql Error %d: %s" % (e.args[0], e.args[1]))

(2)测试代码testMysql.py,做了50个并发,对获取到的数据库记录做了个简单遍历。

01 import threading  
02 import time  
03 import DBOperator
04  
05 def run(): 
06     operator = DBOperator()
07     operator.connDB()
08     starttime = time.time()
09     sql = "select * from stock_cash_tencent"
10     peeps = operator.findBySQL(sql)
11     for in peeps: pass  
12     operator.closeDB()
13     endtime = time.time()
14     diff =  (endtime - starttime)*1000
15     print diff
16      
17 def test():  
18     for in range(50):  
19         threading.Thread(target = run).start() 
20         time.sleep(1)
21      
22 if __name__ == '__main__':  
23      test()

2、连接池相关代码:

(1)connectionpool.py

01 from DBUtils import PooledDB
02 import MySQLdb
03 import string
04  
05 maxconn = 30            #最大连接数
06 mincached = 10           #最小空闲连接
07 maxcached = 20          #最大空闲连接
08 maxshared = 30          #最大共享连接
09 connstring="root#root#127.0.0.1#3307#pystock#utf8" #数据库地址
10 dbtype = "mysql"  
11  
12 def createConnectionPool(connstring, dbtype):
13     db_conn = connstring.split("#");
14     if dbtype=='mysql':
15         try:
16             pool = PooledDB.PooledDB(MySQLdb, user=db_conn[0],passwd=db_conn[1],host=db_conn[2],port=string.atoi(db_conn[3]),db=db_conn[4],charset=db_conn[5], mincached=mincached,maxcached=maxcached,maxshared=maxshared,maxconnections=maxconn)
17             return pool
18         except Exception, e:
19             raise Exception,'conn datasource Excepts,%s!!!(%s).'%(db_conn[2],str(e))
20             return None
21  
22  
23 pool = createConnectionPool(connstring, dbtype)

3、sqlobject相关代码

(1)connection.py

1 from sqlobject.mysql import builder
2  
3 conn = builder()(user='root', password='root',
4                  host='127.0.0.1', db='pystock', port=3307, charset='utf8')

(2)StockCashTencent.py对应到数据库中的表,50个并发并作了一个简单的遍历。(实际上,如果不做遍历,只做count()计算,sqlobject性能是相当高的。)

01 import sqlobject
02 import time
03 from connection import conn
04 import threading
05  
06 class StockCashTencent(sqlobject.SQLObject):
07     _connection = conn
08      
09     code = sqlobject.StringCol()
10     name = sqlobject.StringCol()
11     date = sqlobject.StringCol()
12     main_in_cash = sqlobject.FloatCol()   
13     main_out_cash = sqlobject.FloatCol()  
14     main_net_cash = sqlobject.FloatCol()
15     main_net_rate= sqlobject.FloatCol()
16     private_in_cash= sqlobject.FloatCol()
17     private_out_cash= sqlobject.FloatCol()
18     private_net_cash= sqlobject.FloatCol()
19     private_net_rate= sqlobject.FloatCol()
20     total_cash= sqlobject.FloatCol()
21  
22 def test():
23     starttime = time.time()
24     query  = StockCashTencent.select(True)
25     for result in query: pass
26     endtime = time.time()
27     diff =  (endtime - starttime)*1000
28     print diff
29          
30 if __name__ == '__main__':  
31    for in range(50):  
32         threading.Thread(target = test).start()   
33         time.sleep(1)

测试结果如下:

MySQLdb平均(毫秒) 99.63999271
DBUtil平均(毫秒) 97.07998276
sqlobject平均(毫秒) 343.2999897

结论:其实就测试数据而言,MySQLdb单连接和DBUtil连接池的性能并没有很大的区别(100个并发下也相差无几),相反sqlobject虽然具有的编程上的便利性,但是却带来性能上的巨大不足,在实际中使用哪个模块就要斟酌而定了。

python环境测试MySQLdb、DBUtil、sqlobject性能的更多相关文章

  1. 老司机带你用vagrant打造一站式python开发测试环境

      前言 作为一个学习和使用Python的老司机,好像应该经常总结一点东西的,让新司机尽快上路,少走弯路,然后大家一起愉快的玩耍. 今天,咱们就使用vagrant配合xshell打造一站式Python ...

  2. 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

    黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...

  3. Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!

    Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!

  4. python selenium 测试环境的搭建及python mysql的连接

    又来一篇傻瓜教程啦,防止在学习的小伙伴们走弯路. 1.python 环境搭建 python官网:https://www.python.org/downloads/  选择最新版本python下载(如果 ...

  5. Anaconda 安装 Python 库(MySQLdb)的方法

    [已解决]Anaconda 安装 Python 库(MySQLdb)的方法 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 201 ...

  6. (转)windows系统下Python环境的搭建

    原博文地址:http://www.cnblogs.com/windinsky/archive/2012/09/20/2695520.html 这段时间在做python,觉得这个配置环境的帖子还不错,分 ...

  7. Python学习第一弹——Python环境搭建

    一.Python简介: Python,是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具有 ...

  8. 1 python学习——python环境配置

    1 python学习--python环境配置 要学习python语言,光看书看教程还是不好,得动手去写.当然,不管学习什么编程语言,最佳的方式还在于实践. 要实践,先得有一个Python解释器来解释执 ...

  9. 【转】Selenium WebDriver + Python 环境

    转自:http://www.myext.cn/webkf/a_11878.html 1. 下载必要工具及安装包 1.1 [Python开发环境] 下载并安装Python 2.7.x版本 下载地址:ht ...

随机推荐

  1. gitlab上fork别人的代码后更新的2种解决方式

    1.解决方式1 首先要先确定一下是否建立了主repo的远程源: git remote -v如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...

  2. 在Vmware安装虚拟机WindowsServer 2003

    一.创建并安装虚拟机 新建Windows2003server系统 按照下面操作即可 https://www.cnblogs.com/color-blue/p/8525710.html 二.安装虚拟机 ...

  3. 洛谷P1508 Likecloud-吃、吃、吃 [2017年4月计划 动态规划10]

    P1508 Likecloud-吃.吃.吃 题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一 ...

  4. Javascript实现信息滚动效果的方法

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  5. PhpStorm中如何配置SVN,详细操作方法 - 郑加全的博客 - CSDN博客

      登录|注册       郑加全的博客       目录视图 摘要视图 订阅 CSDN日报0711——<离开校园,入职阿里,开启新的程序人生>      征文 | 你会为 AI 转型么? ...

  6. IntelliJ IDEA包层级结构显示方式

    在开发的过程中,程序结构增多,通过树状结构看包结构目录,更加舒适. Idea默认情况下是不分层级展示包结构的 点击设置标志按钮,如下图所示 去掉Hide Empty Middle Packages的勾 ...

  7. 阿里云MaxCompute 2019-7月刊

    您好,MaxCompute 2019.7月刊为您带来7月产品.技术最新动态,欢迎阅读. 导读 [发布]7月产品重要发布 [资讯]7月重要资讯 [文档]7月重要文档更新推荐 [干货]7月精选技术文章推荐 ...

  8. Visual studio加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS,需要配置虚拟目录。解决办法。

    在SVN上下载工程项目.使用visual studio打开时,出现如下提示: 查找相关资料,解决办法如下: 使用记事本打开工程目录下的.csproj文件.把<UseIIS>False< ...

  9. python csv文件打开错误:_csv.Error: line contains NULL byte

    当python读取文件出现_csv.Error: line contains NULL byte时, # -*- coding:utf-8 -*- import csv with open(r'E:\ ...

  10. linux通常使用的 rc 和 .(点)文件

    文件名 描述 ~/.bash_login 请参考“man bash”.如果 ~/.bash_profile 不存在,bash 则将 ~/.bash_login 作为 ~/.bash_profile 处 ...