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. 移植thinkPHP的dump()函数

    由于公司的开发机没有开xdebug拓展,导致var_dump()在浏览器上看很不方便. 因此,加入从thinkphp搬过来的dump()函数. function dump($var, $echo=tr ...

  2. 读书笔记--Hibernate in Action 目录

    1.理解对象/关系持久化 2.启动项目 3.领域模型和元数据 4.映射持久化类 5.继承和定制类型 6.映射集合和实体关联 7.高级实体关联映射 8.遗留数据库和定制SQL 9.使用对象 10.事务和 ...

  3. python基础--线程、进程

    并发编程: 操作系统:(基于单核研究) 多道技术: 1.空间上的复用 多个程序共用一个计算机 2.时间上的复用 切换+保存状态 例如:洗衣 烧水 做饭 切换: 1.程序遇到IO操作系统会立刻剥夺着CP ...

  4. Leetcode33.Search in Rotated Sorted Array搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  5. TP3.2.x判断手机端访问并设置默认访问模块的方法 - ThinkPHP框架

    手机端访问时调用Wap手机模块,实现在手机端访问时展示出手机网站,无需跳转域名首先我们在./Application/Common/Conf/ 目录下建立两个公共配置文件:config.php 和con ...

  6. Qt: error lnk1158 无法运行rc.exe

    解决办法:(依据自己的环境而定) 将C:\Program Files (x86)\Windows Kits\\bin\10.0.15063.0\x64 目录下的rc.exe 和rcdll.dll 复制 ...

  7. DOM 创建元素 删除元素(结点)

    创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. <script> var para=document. ...

  8. No.5 Verilog 建模方式

    5-1 门级建模 VerilogHDL内建基元门: 多输入门:and, nand, or, nor, xor, xnor; 多输出门:buf, not 三态门:bufif0, bufif1, noti ...

  9. python 爬取段子网段子写入文件

    import requests import re 进入网址 for i in range(1,5): page_url = requests.get(f"http://duanziwang ...

  10. python学习笔记10--协程、IO、IO多路复用

    本节内容 一.协程 1.1.协程概念 1.2.greenlet 1.3.Gevent 1.4.协程之爬虫 1.5.协程之socket 二.论事件驱动与异步IO 三.IO 3.1.概念说明 3.2.IO ...