利用c模块代码,提升python代码执行效率
2012-11-06 15:29
926 查看
在用python 的分布式脚本进行压测的时候,发现一个关键性的瓶颈,即单个线程的性能不高.
比如,同样压mysql,单线程执行,同样的物理机
用c实现,实际测试的执行10000次连接的时间是python执行的一半左右.
虽然,很多时候,可以通过单个增加线程数来实现压力,但是,对于mysql这种线程数过多,性能会下降的东西,是个死穴.
比如,mysql的最佳性能是64左右的并发连接
如果同样用python的64个线程和c的64个线程是去压测,则拿到的qps数据是不一样的.即,server的最佳性能数据可能没法获取.
所以,为了提高python脚本的单线程的压测性能,可以采用在业务逻辑的action 用c实现,并用python调用,实际测试结果如下:
1. 编写c的例子函数代码:
编译打包成so文件
g++ mysql_connect_test.c -fPIC -shared -o test.so -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
用python 脚本的测试mysql连接10000次和python调用c函数执行连接10000次,比较执行时间
实际测试结果:
[root@host c]# python compare.py
c 10000 cost:55.5732438564
python 10000 cost:77.1144480705
性能能提高38%.这和之前,直接用python和c去压测的结果已经接近了.效果非常好.
比如,同样压mysql,单线程执行,同样的物理机
用c实现,实际测试的执行10000次连接的时间是python执行的一半左右.
虽然,很多时候,可以通过单个增加线程数来实现压力,但是,对于mysql这种线程数过多,性能会下降的东西,是个死穴.
比如,mysql的最佳性能是64左右的并发连接
如果同样用python的64个线程和c的64个线程是去压测,则拿到的qps数据是不一样的.即,server的最佳性能数据可能没法获取.
所以,为了提高python脚本的单线程的压测性能,可以采用在业务逻辑的action 用c实现,并用python调用,实际测试结果如下:
1. 编写c的例子函数代码:
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 #include "mysql.h" 5 extern "C" { 6 bool connect(){ 7 8 MYSQL my_connection; 9 mysql_init(&my_connection); 10 if(mysql_real_connect(&my_connection,"10.1.147.97","wangzytest","a1234561","wangzy",8066,NULL,0)){ 11 //printf("connection successfule\n"); 12 mysql_close(&my_connection); 13 return true; 14 }else{ 15 fprintf(stderr,"connection failed\n"); 16 if(mysql_errno(&my_connection)){ 17 fprintf(stderr,"%d,%sn",mysql_errno(&my_connection),mysql_error(&my_connection)); 18 } 19 return false; 20 21 } 22 } 23 }
编译打包成so文件
g++ mysql_connect_test.c -fPIC -shared -o test.so -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
用python 脚本的测试mysql连接10000次和python调用c函数执行连接10000次,比较执行时间
1 import ctypes 2 import time 3 import MySQLdb 4 5 so = ctypes.CDLL('./test.so') 6 7 begin = time.time() 8 for i in range(0,10000): 9 so.connect() 10 11 end = time.time() 12 13 print "c 10000 cost:%s"%(end-begin) 14 15 16 def py_connect(): 17 try: 18 conn = MySQLdb.connect(host='10.1.147.97',port=8066,user='wangzytest',passwd='a1234561',db='wangzy') 19 conn.close() 20 return True 21 except Exception,e: 22 return False 23 24 begin_1 = time.time() 25 for i in range(0,10000): 26 py_connect() 27 end_1 = time.time() 28 29 print "python 10000 cost:%s"%(end_1 - begin_1)
实际测试结果:
[root@host c]# python compare.py
c 10000 cost:55.5732438564
python 10000 cost:77.1144480705
性能能提高38%.这和之前,直接用python和c去压测的结果已经接近了.效果非常好.
相关文章推荐
- python中使用time模块计算代码执行效率的精度测试(转)
- python中使用time模块计算代码执行效率的精度测试
- Python实战小程序利用matplotlib模块画图代码分享
- python中利用time模块,计算一段代码运行的时间。
- 利用Boost.Python将C++代码封装为Python模块
- 利用python fabric模块写的批量操作远程主机脚本(命令执行,上传、下载文件)
- .net中利用oracle产品自带的数据访问组件(Oracle.DataAccess.dll)提升批量更新操作的执行效率
- Python3,通过re模块中的sub()和findall()2个方法提升爬虫提取数据的效率
- 提高python代码的执行效率
- 利用StopWatch来监视代码执行效率
- 使用优化器来提升Python程序的执行效率的教程
- Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
- Python tricks(6) -- python代码执行的效率
- 安装python pip,再安装request模块,执行python代码
- [Python] 利用commands模块执行Linux shell命令
- 利用ctags提升看、写代码的效率
- 利用Boost.Python将C++代码封装为Python模块
- [Python] 利用commands模块执行Linux shell命令
- python3 timeit:计算小段代码的执行时间的模块
- 提升python程序效率:使用局部变量替换模块变量