Python呼叫C模組以及效能分析

發表於2016-12-15

一.c,ctypes和python的資料型別的對應關係

ctypes type ctype Python type
c_char char 1-character string
c_wchar wchar_t 1-character unicode string
c_byte char int/long
c_ubyte unsigned char int/long
c_short short int/long
c_ushort unsigned short int/long
c_int int int/long
c_uint unsigned int int/long
c_long long int/long
c_ulong unsigned long int/long
c_longlong __int64 or long long int/long
c_ulonglong unsigned __int64 or unsigned long long int/long
c_float float float
c_double double float
c_char_p char * (NUL terminated) string or None
c_wchar_p wchar_t * (NUL terminated) unicode or None
c_void_p void * int/long or None

2.操作int

3.操作字串

4.操作指標

  • 通過pointer獲取一個值的指標
  • 通過contents獲取一個指標的值

5.c的結構體

6.訪問so檔案

1.建立一個c檔案

2.編譯成動態連結庫

3.python中呼叫庫中的函式

二.測試c的效能和python的差別

sum.c
#include

  • 測試方案:計算1-100的和
  • 測試次數:100萬次

    1. 直接用c來執行,通linux 的time命令來記錄執行的用時

    sum.c:

    測試結果的例子:

    real 1.16
    user 1.13
    sys 0.01

2.通過Python呼叫so檔案和python的測試結果

sum_test.py:

測試結果的例子

3.測試erlang的測試結果

剛剛學了erlang,那就一起測試一下erlang的運算效能
sum.erl:

呼叫:

測試結果的例子:

4.測試結果

用上面的測試方法,進行10次測試,去除最大值和最小值,再計算平均值,得出:

Python呼叫c 原生的c Python erlang
0.95 0.48 8.47 2.43

單位:秒

  • 求和的執行,使用的記憶體比較小,但是佔用CPU資源比較多。
  • 原生的C是最快的,Python呼叫c會稍微慢一點,原因是計算100的和的操作是在c裡面做的,而執行100萬次的邏輯是在python做的
  • erlang的效能雖然比c稍慢,但是也是不錯的,
  • Python的執行效率慘不忍睹。。。

相關文章