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秒。
二、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秒。
三、性能問題解決方法:
通過上面的比較,可以看出,同樣一個算法,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程序運行結果的差不多。
四、后記
通過pyhton調用dll文件僅是提高性能的一個辦法,如C和python混合編程等方法均可實現此目的,具體請見后續博文。