Python:通過執行100萬次列印來比較C和python的效能,以及用C和python結合來解決效能問題的方法
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混合程式設計等方法均可實現此目的,具體請見後續博文。
相關推薦
Python:通過執行100萬次列印來比較C和python的效能,以及用C和python結合來解決效能問題的方法
python作為動態語言,開發效率相當高,但如我們所知,動態語言的執行效率往往是比較低的,請看下面簡單的測試過程: 一、 C語言實現100萬次列印: 程式碼: #include<stdio.h> #include <time.h> int
Python tkinter 實現簡單登陸註冊 基於B/S三層體系結構,實現用戶身份驗證
cte cursor 實現簡單 結果 pass 分享圖片 not null for 技術 Python tkinter 實現簡單登陸註冊 最終效果 開始界面 ? 註冊 登陸 ? 源碼 login.py # encoding=utf-8 f
Python在ubuntu上面的安裝,遇到的問題,以及一些有用的python庫安裝
在linux環境下面,一般都配置了python環境。mac下面也是。 但是有時候使用者會發現,系統自帶的python版本比較舊,於是想要更新python版本。 例如我在自己的ubuntu下面有一個自帶的python2.7。但是需要用到python3,於是我不得不重新
用cmd執行記事本寫的java檔案,以及jdk版本和執行版本不一致原因及其解決辦法
1.首先新建一個記事本,檔名改為Welcome.java拓展名也要改!(屬性裡面改為顯示拓展名,這樣才可以通過重新命名的方式改檔案個格式) public class Welcome{ public static void main(String[] args){ System.out.pr
Java開發八年來總結的知識腦圖,以及我的進階線路規劃。
學習一個新的技術時,其實不在於跟著某個教程敲出了幾行、幾百行程式碼,這樣你最多隻能知其然而不知其所以然,進步緩慢且深度有限,最重要的是一開始就對整個學習路線有巨集觀、簡潔的認識,確定大的學習方向,這樣才能事半功倍。 我們經常會遇到這樣的情況:一開始學習一門新技術的時候,面對
希望有一天,能用私營企業的標準來搞學術,培養人才
我是一名剛剛入職不到五個月的職場小白,所從事的工作是在隸屬於一家從事視訊業務開發的上市公司中的硬體部門做嵌入式開發。入職這五個月以來,有著頗多的感觸,想在這裡聊聊自己的一些想法,也剛好以這篇文章,作為自己寫部落格的開始! 筆者在國內一所頂尖的工科類院校就讀自動化專業,毫不誇張的說,
【JavaSE】執行緒的同步和死鎖,synchronized物件鎖和全域性鎖,一個生活的例子解釋。
1.多執行緒為什麼要加鎖? 因為在多執行緒啟動之後,所有執行緒都是無順序任意執行的,甚至幾乎同時訪問同一個資源或者程式碼塊,所以上一個執行緒對資源所做的改變,還沒來得及使用,就有可能被下一個執行緒所覆蓋。 引入鎖的概念,就是為了讓競爭資源在各個執行緒使用的時候
劍指Offer演算法題JAVA版21-30題(全是個人寫的非官方,只供參考和自己複習,測試用例都通過了。)
21.棧的壓入、彈出序列、 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓
使用用 Angular CLI 來建立Angular2專案、應用和庫程式碼,以及檔案說明
1、要安裝CLI命令必須首先安裝Nodejs和npm包,npm包在裝好nodejs後自帶的。 2、首先建立一個目錄,用來建立Angular專案,如下圖所示: 3、開啟dos視窗,然後進入到此目錄中,如下圖所示: 4、安裝 Angular CLI,使用:npm instal
N個臺階,一次可以走一步或者兩步,求走這n個臺階有多少種方法(遞迴和非遞迴實現)
1、遞迴實現 <pre name="code" class="cpp">///遞迴方法 int Fibonacci(unsigned int N) { if(N<=2)
從遞迴版歸併排序演算法看遞迴函式連續兩次呼叫自己函式每步如何返回,看遞迴和棧的關係
這個題目牽涉問題比較多,主要涉及幾個關鍵詞:遞迴函式,棧,歸併排序演算法(這裡使用遞迴實現),呼叫和返回。 首先解釋一下關鍵詞。1、遞迴函式是直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式。遞迴函式必須至少有一個退出條件,即不再繼續呼叫自己而是返回
七夕來了,請用C 語言和我交流
C語言輸入&輸出 當我們提到輸入時,這意味著要向程式填充一些資料。輸入可以是以檔案的形式或從命令列中進行。C 語言提供了一系列內建的函式來讀取給定的輸入,並根據需要填充到程式中。 當我們提到輸出時,這意味著要在螢幕上、印表機上或任意檔案中顯示一些資料。C 語言
C#實參和傳參,以及為什麼實參的值通過方法後不會改變
1.值型別 例如:我們定義一個函式 static void Exchange(int x, int y) { int flag = x; flag = y; y = x; x = flag; }其中,int
劍指Offer演算法題JAVA版13-20題(全是個人寫的非官方,只供參考和自己複習,測試用例都通過了。)
13.調整陣列順序使奇數位於偶數前面 輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。 (思路:是一個類似與快速排序,的思路,但快速排序是不穩定的。要
一箇中興的面試題,輸入兩個數n和m,從數列1,2,3……n中隨意取幾個數,使其和等於m,要求將其中所有組合列出來程式設計求解(c語言遞迴函式分解法)
原題目:輸入兩個數n和m,從數列1,2,3……n中隨意取幾個數,使其和等於m,要求將其中所有組合列出來程式設計求解 c語言解法分析: 先判定n和m的大小,如果m小於n,則只需從1,2……m之間找出和為m的組合即可,如果m大於n,則需要判斷1~n的和是否
python @classmethod 和 @staticmethod區別,以及類中方法引數cls和self的區別
staticmethod 首先來看@staticmethod,這個裝飾器很好理解,就是讓類中的方法變成一個普通的函式(因為是普通函式,並沒有繫結在任何一個特定的類或者例項上。所以與不需要物件例項化就可以直接呼叫)。可以使用類或者類的例項呼叫,並且沒有任何隱含引數的傳入,
Python同時安裝py2.x和py3.x,以及Windows下virtualenv和flask的安裝
1.py2.x和py3.x的安裝 由於學習需要或者個人折騰,可能會在同一臺電腦上面安裝py2.x和py3.x兩個版本。下面就開始介紹如何安裝,還有pip的使用。 1.安裝好py2.x和py3.x到本機,並配置好環境變數,關於環境變數,可以在安裝時選擇add
從源碼來理解slf4j的綁定,以及logback對配置文件的加載
conf efault 會有 noclass bin roo ogg file groovy https://www.cnblogs.com/youzhibing/p/6849843.html 編譯期間,完成slf4j的綁定已經logback配置文件的加載。slf4
我們如何用Go來處理每分鐘100萬復雜請求的場景
lec listen image 由於 開發 resp 復雜 cal itl 在Malwarebytes 我們經歷了顯著的增長,自從我一年前加入了矽谷的公司,一個主要的職責成了設計架構和開發一些系統來支持一個快速增長的信息安全公司和所有需要的設施來支持一個每天百萬用戶使
資深程序員用Python實現每秒處理 120 萬次 HTTP 請求!什麽概念
更多 PE aws wsgi 語言 對象 虛擬 釋放 功能 Python 的微框架(藍色)、NodeJS 和 Go (綠色) 和 Japronto (紫色) 勘誤表:用戶 @heppu 提到,如果謹慎點用 Go 的 stdlib HTTP 服