您的位置:首页 > 编程语言 > Python开发

利用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的例子函数代码:

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去压测的结果已经接近了.效果非常好.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: