利用ctypes提高python的执行速度方法介绍

这篇文章给大家介绍了如何利用ctypes提高python的执行速度,对大家学习使用python具有一定的参考借鉴价值。有需要的朋友们一起来看看吧。

“>

前言

ctypes是python的外部函数库。它提供了c兼容的数据类型,并且允许调用动态链接库/共享库中的函数。它可以将这些库包装起来给python使用。这个引入c语言的接口可以帮助我们做很多事情,比如需要调用c代码的来提高性能的一些小型问题。通过它你可以接入windows系统上的 kernel32.dll 和 msvcrt.dll 动态链接库,以及linux系统上的 libc.so.6 库。当然你也可以使用自己的编译好的共享库

我们先来看一个简单的例子 我们使用 python 求 1000000 以内素数,重复这个过程10次,并计算运行时间。

import mathfrom timeit import timeitdef check_prime(x): values = xrange(2, int(math.sqrt(x)) + 1) for i in values: if x % i == 0: return false return truedef get_prime(n): return [x for x in xrange(2, n) if check_prime(x)]print timeit(stmt=’get_prime(1000000)’, setup=’from __main__ import get_prime’, number=10)

输出

42.8259568214

下面用c语言写一个的 check_prime 函数,然后把它当作共享库(动态链接库)导入

#include #include int check_prime(int a){ int c; for ( c = 2 ; c = mid && left < right) right--; swap(&arr[left], &arr[right]); } if (arr[left] >= arr[range.end]) swap(&arr[left], &arr[range.end]); else left++; r[p++] = new_range(range.start, left – 1); r[p++] = new_range(left + 1, range.end); }}gcc -shared -o mylib.so -fpic mylib.c

使用ctypes有一个麻烦点的地方是原生的c代码使用的类型可能跟python不能明确的对应上来。比如这里什么是python中的数组?列表?还是 array 模块中的一个数组。所以我们需要进行转换

test.py

import ctypesimport timeimport randomquick_sort = ctypes.cdll(‘./mylib.so’).quick_sortnums = []for _ in range(100): r = [random.randrange(1, 100000000) for x in xrange(100000)] arr = (ctypes.c_int * len(r))(*r) nums.append((arr, len(r)))init = time.clock()for i in range(100): quick_sort(nums[i][0], nums[i][1])print “%s” % (time.clock() – init)

输出

1.874907

与python list 的 sort 方法进行对比

import ctypesimport timeimport randomquick_sort = ctypes.cdll(‘./mylib.so’).quick_sortnums = []for _ in range(100): nums.append([random.randrange(1, 100000000) for x in xrange(100000)])init = time.clock()for i in range(100): nums[i].sort()print “%s” % (time.clock() – init)

输出

2.501257

至于结构体,需要定义一个类,包含相应的字段和类型

class point(ctypes.structure): _fields_ = [(‘x’, ctypes.c_double), (‘y’, ctypes.c_double)]

除了导入我们自己写的c语言扩展文件,我们还可以直接导入系统提供的库文件,比如linux下c标准库的实现 glibc

import timeimport randomfrom ctypes import cdlllibc = cdll.loadlibrary(‘libc.so.6’) # linux系统# libc = cdll.msvcrt # windows系统init = time.clock()randoms = [random.randrange(1, 100) for x in xrange(1000000)]print “python version: %s seconds” % (time.clock() – init)init = time.clock()randoms = [(libc.rand() % 100) for x in xrange(1000000)]print “c version : %s seconds” % (time.clock() – init)

输出

python version: 0.850172 secondsc version : 0.27645 seconds

总结

以上就是这篇文章的全部内容,希望对大家学习或使用python能有一定的帮助,如果有疑问大家可以留言交流。

以上就是利用ctypes提高python的执行速度方法介绍的详细内容,更多请关注 第一php社区 其它相关文章!

Posted in 未分类