一. c,ctypes 和 python 的数据类型的对应关系
- >>> from ctypes import * >>> c = c_int(34) >>> c c_int(34) >>> c.value 34 >>> c.value = 343 >>> c.value 343
- >>> p = create_string_buffer(10) >>> p.raw '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p.value = 'fefefe' >>> p.raw 'fefefe\x00\x00\x00\x00' >>> p.value = 'fefeeeeeeeeeeeeeeeeeeeeeee' #字符串太长,报错 Traceback (most recent call last) : File "<stdin>",
- line 1,
- in < module > ValueError: string too long
- >>> i = c_int(999) >>> pi = pointer(i) >>> pi < __main__.LP_c_int object at 0x7f7be1983b00 > >>> pi.value Traceback (most recent call last) : File "<stdin>",
- line 1,
- in < module > AttributeError: 'LP_c_int' object has no attribute 'value' >>> pi.contents c_int(999) >>> pi.contents = c_long(34343) >>> pi.contents c_int(34343)
- #定义一个c的structure,包含两个成员变量x和y >>> class POINT(Structure) : ... _fields_ = [('x', c_int), ('y', c_int)] ... >>> point = POINT(2, 4) >>> point < __main__.POINT object at 0x7f7be1983b90 > >>> point.x,
- point.y (2, 4) >>> porint = POINT(y = 2) >>> porint < __main__.POINT object at 0x7f7be1983cb0 > >>> point = POINT(y = 2) >>> point.x,
- point.y (0, 2) 定义一个类型为POINT的数组 >>> POINT_ARRAY = POINT * 3 >>> pa = POINT_ARRAY(POINT(2, 3), POINT(2, 4), POINT(2, 5)) >>>
- for i in pa: print pa.y ... Traceback (most recent call last) : File "<stdin>",
- line 1,
- in < module > AttributeError: 'POINT_Array_3' object has no attribute 'y' >>>
- for i in pa: print i.y ... 3 4 5
1. 创建一个 c 文件
- #include < stdio.h > int hello_world() { printf("Hello World\n");
- return 0;
- } int main() { hello_world();
- return 0;
- }
2. 编译成动态链接库
- gcc hello_world.c - fPIC - shared - o hello_world.so
3.python 中调用库中的函数
- from ctypes import cdll c_lib = cdll.LoadLibrary('./hello_world.so') c_lib.hello_world()
sum.c
- int sum(int num) { long sum = 0; int i = 0;
- for ( i = 1; i <= num; i++) { sum = sum + i;
- };
- return sum;
- } int main() { printf("%d", sum(10));
- return 0;
- }
sum.c:
- #include < stdio.h > int sum(int num) { long sum = 0; int i = 0;
- for ( i = 1; i <= num; i++) { sum = sum + i;
- };
- return sum;
- } int main() { int i ;
- for (i = 0; i < 1000000; i++) { sum(100);
- }
- return 0;
- }
测试结果的例子:
sum_test.py:
- def sum_python(num) : s = 0
- for i in xrange(1, num + 1) : s += i
- return s from ctypes import cdll c_lib = cdll.LoadLibrary('./sum.so') def sum_c(num) :
- return c_lib.sum(num) def test(num) : import timeit t1 = timeit.Timer('c_lib.sum(%d)' % num, 'from __main__ import c_lib') t2 = timeit.Timer('sum_python(%d)' % num, 'from __main__ import sum_python') print 'c',
- t1.timeit(number = 1000000) print 'python',
- t2.timeit(number = 1000000)
- if __name__ == '__main__': test(100)
测试结果的例子
- c 1.02756714821 python 7.90672802925
刚刚学了 erlang,那就一起测试一下 erlang 的运算性能
sum.erl:
- - module(sum). - export([sum / 2, sum_test / 2]). sum(0, Sum) - > Sum; sum(Num, Sum) - > sum(Num - 1, Sum + Num). sum_test(Num, 0) - > 0; sum_test(Num, Times) - > sum(Num, 0),
- sum_test(Num, Times - 1).
调用:
- timer: tc(sum, sum_test, [100, 1000000]).
测试结果的例子:
- {
- 2418486,
- 0
- }
用上面的测试方法,进行 10 次测试,去除最大值和最小值,再计算平均值,得出:
单位:秒
来源: http://www.tuicool.com/articles/mIFbMru