python作为动态语言,开发效率相当高,但如我们所知,动态语言的执行效率往往是比较低的,请看下面简单的测试过程:
### 一、 C语言实现100万次打印:
代码:
~~~
#include<stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
unsigned long i = 1;
unsigned long ulNum = 1000000;
clock_t start, finish;
double duration;
start = clock();
while (ulNum != 0)
{
printf("\nThe ulNum is: %u ", i);
ulNum--;
i++;
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "\n Use Time: %f seconds\n", duration );
system("pause");
return 0;
}
~~~
测试:
可看出,执行了约489秒。
![](https://box.kancloud.cn/2016-06-08_57579355b4c31.gif)
### 二、python实现100万次打印:
代码:
~~~
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import os
time_begin = time.clock()
i = 1
ulNum = 1000000
while (ulNum != 0):
print "The ulNum is: %u " % i
ulNum -= 1
i += 1
print "Use time: %s" % (time.clock() - time_begin)
os.system("pause")
~~~
测试:
可看出,执行了约675秒。
![](https://box.kancloud.cn/2016-06-08_57579355c93f5.gif)
### 三、性能问题解决方法:
通过上面的比较,可以看出,同样一个算法,C和python执行所需要的时间相差180多秒,所以我们需要一个解决方法,使编程既有python般的开发效率,又有C般的执行效率,所以我们想到如果将python程序中消耗性能最大的语句用C来实现,将会比较好地解决此问题,当然,实现方法可能有多种,本文仅通过python调用dll的方法来实现,其他方法后续再分析。
思路如下:
1、将程序中循环部分用C实现,并封装为一个dll;
2、在python中调用此dll来计算;
方案实现:
1、制作dll,使用VC可以很方便的制作一个dll出来,代码如下,编译一下就会生成一个test_dll.dll文件,注意编译成Release版本。
~~~
// test_dll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <stdio.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" _declspec(dllexport) void print_sum(unsigned long ulNum)
{
unsigned long i = 1;
while (ulNum != 0)
{
printf("\nThe ulNum is: %u ", i);
ulNum--;
i++;
}
}
~~~
2、使用python调用test_dll.dll文件,代码如下:
~~~
import os
import ctypes
import time
time_begin = time.clock()
test_dll = ctypes.cdll.LoadLibrary('test_dll.dll')
test_dll.print_sum(1000000)
print "Use time: %s" % (time.clock() - time_begin)
os.system("pause")
~~~
3、测试一下这次的执行时间:
这次我们用了507秒,可以看出和C程序运行结果的差不多。
![](https://box.kancloud.cn/2016-06-08_57579355e3d94.gif)
### 四、后记
通过pyhton调用dll文件仅是提高性能的一个办法,如C和python混合编程等方法均可实现此目的,具体请见后续博文。
- 前言
- Python:实现文件归档
- Pyhon:按行输出文件内容
- Python:读文件和写文件
- Python:实现一个小算法
- Python:通过命令行发送新浪微博
- Python:通过摄像头实现的监控功能
- Python:通过摄像头抓取图像并自动上传至新浪微博
- Python:简单的摄像头程序实现
- Python:日志模块logging的应用
- Python:操作嵌入式数据库SQLite
- Python:将句子中的单词全部倒排过来,但单词的字母顺序不变
- Python:语音处理,实现在线朗读RFC文档或本地文本文件
- Python:通过计算阶乘来学习lambda和reduce这两个函数的使用
- Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法
- Python:使用matplotlib绘制图表
- Python:使用pycha快速绘制办公常用图(饼图、垂直直方图、水平直方图、散点图等七种图形)
- Python:使用pycha快速绘制办公常用图二(使用样式定制个性化图表)
- Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中
- Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性
- Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性(二)
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(一)
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)
- Python:通过自定义系统级快捷键来控制程序运行
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Python:一个多功能的抓图工具开发(附源码)
- Python:程序发布方式简介一(打包为可执行文件EXE)
- Python:新浪微博应用开发简介(认证及授权部分)
- Python:程序最小化到托盘功能实现
- Python:实用抓图工具开发介绍(含需求分析、设计、编码、单元测试、打包、系统测试、发布各环节)
- Python:桌面气泡提示功能实现
- Python:未来三个月的python学习计划
- Python:pygame模块及SDL库简介
- Python:获取新浪微博用户的收听列表和粉丝列表
- Python:pygame游戏编程之旅一(Hello World)
- Python:pygame游戏编程之旅二(自由移动的小球)
- Python:pygame游戏编程之旅三(玩家控制的小球)
- Python:pygame游戏编程之旅四(游戏界面文字处理)
- Python:pygame游戏编程之旅五(游戏界面文字处理详解)
- Python:pygame游戏编程之旅六(游戏中的声音处理)
- Python:pygame游戏编程之旅七(pygame基础知识讲解1)
- Python:编程“八荣八耻”之我见
- Python:脚本的几种执行方式
- wxPython:简单的wxPython程序
- wxPython:简单的wxPython程序的另一种写法
- wxPython:应用程序对象介绍
- wxPython:输出重定向
- wxPython:关闭wxPython程序
- wxPython:Frame类介绍
- wxPython:面板Panel的使用
- wxPython:工具栏、状态栏、菜单实现
- wxPython:消息对话框MessageDialog
- wxPython:文本对话框TextEntryDialog
- wxPython:列表选择框SingleChoiceDialog
- wxPython:事件处理介绍一
- wxPython:事件处理介绍二
- wxPython: 简单的绘图例子
- wxPython:状态栏介绍
- wxPython:菜单介绍
- wxPython:文件对话框wx.FileDialog
- wxPython:颜色选择对话框wx.ColourDialog
- wxPython:布局管理器sizer介绍
- wxPython:启动画面SplashScreen介绍
- wxPython:绘画按钮BitmapButton介绍
- wxPython:进度条Gauge介绍
- Python: 发送新浪微博(使用oauth2)
- Python:读取新浪微博收听列表
- Python:DNS客户端实现