iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用ctypes提高Python的执行速度
  • 460
分享到

利用ctypes提高Python的执行速度

速度ctypesPython 2022-06-04 18:06:43 460人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

前言 ctypes是python的外部函数库。它提供了C兼容的数据类型,并且允许调用动态链接库/共享库中的函数。它可以将这些库包装起来给Python使用。这个引入C语言的接口可以帮助我们做很多事情,比如需要

前言

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

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


import math
from timeit import timeit


def check_prime(x):
  values = xrange(2, int(math.sqrt(x)) + 1)
  for i in values:
    if x % i == 0:
      return False
  return True


def 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 <stdio.h>
#include <math.h>
int check_prime(int a)
{
  int c;
  for ( c = 2 ; c <= sqrt(a) ; c++ ) {
    if ( a%c == 0 )
      return 0;
  }
  return 1;
}

使用以下命令生成 .so (shared object)文件


GCc -shared -o prime.so -fPIC prime.c

import ctypes
import math
from timeit import timeit
check_prime_in_c = ctypes.CDLL('./prime.so').check_prime


def check_prime_in_py(x):
  values = xrange(2, int(math.sqrt(x)) + 1)
  for i in values:
    if x % i == 0:
      return False
  return True


def get_prime_in_c(n):
  return [x for x in xrange(2, n) if check_prime_in_c(x)]


def get_prime_in_py(n):
  return [x for x in xrange(2, n) if check_prime_in_py(x)]


py_time = timeit(stmt='get_prime_in_py(1000000)', setup='from __main__ import get_prime_in_py',
         number=10)
c_time = timeit(stmt='get_prime_in_c(1000000)', setup='from __main__ import get_prime_in_c',
        number=10)
print "Python version: {} seconds".fORMat(py_time)

print "C version: {} seconds".format(c_time)

输出


Python version: 43.4539749622 seconds
C version: 8.56250786781 seconds

我们可以看到很明显的性能差距 这里有更多的方法去判断一个数是否是素数

再来看一个复杂点的例子 快速排序

mylib.c


#include <stdio.h>

typedef struct _Range {
  int start, end;
} Range;

Range new_Range(int s, int e) {
  Range r;
  r.start = s;
  r.end = e;
  return r;
}

void swap(int *x, int *y) {
  int t = *x;
  *x = *y;
  *y = t;
}

void quick_sort(int arr[], const int len) {
  if (len <= 0)
    return;
  Range r[len];
  int p = 0;
  r[p++] = new_Range(0, len - 1);
  while (p) {
    Range range = r[--p];
    if (range.start >= range.end)
      continue;
    int mid = arr[range.end];
    int left = range.start, right = range.end - 1;
    while (left < right) {
      while (arr[left] < mid && left < right)
        left++;
      while (arr[right] >= 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 ctypes
import time
import random

quick_sort = ctypes.CDLL('./mylib.so').quick_sort
nums = []
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 ctypes
import time
import random

quick_sort = ctypes.CDLL('./mylib.so').quick_sort
nums = []
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 time
import random
from ctypes import cdll
libc = 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 seconds
C version : 0.27645 seconds

总结

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

--结束END--

本文标题: 利用ctypes提高Python的执行速度

本文链接: https://www.lsjlt.com/news/14304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何提高 PHP 函数的执行速度
    优化 php 函数执行速度有以下四种方法:1. 避免不必要的循环;2. 缓存昂贵的计算;3. 使用原生函数;4. 使用类型提示。实战中,通过对 calculatetaxrate 函数进行...
    99+
    2024-04-23
    php 运行效率
  • Node.js V8 引擎与代码缓存:提高 JavaScript 执行速度的利器
    代码缓存 代码缓存是一种优化技术,可存储 JavaScript 代码的编译版本,以便在后续执行时快速访问。这提高了 JavaScript 代码的执行速度,因为它消除了编译代码的开销,尤其是对于经常执行的代码段。 V8 引擎与代码缓存的协同...
    99+
    2024-04-02
  • python运行速度怎么提高
    有几种方法可以提高Python的运行速度: 使用适当的数据结构:选择合适的数据结构可以提高程序的效率。例如,使用字典而不是列表来...
    99+
    2023-10-25
    python
  • python怎么提高运行速度
    以下是一些提高Python运行速度的方法:1. 使用更高效的算法:优化算法可以显著提高程序的运行速度。通过选择更适合问题的算法,可以...
    99+
    2023-09-08
    python
  • 怎么提高python运行速度
    提高Python程序的运行速度有以下几个方法:1. 使用更高效的算法和数据结构:选择适当的算法和数据结构可以大大提高程序的运行速度。...
    99+
    2023-09-04
    python
  • 怎么让Python运行速度提高100倍
    这篇文章主要介绍“怎么让Python运行速度提高100倍”,在日常操作中,相信很多人在怎么让Python运行速度提高100倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让Python运行速度提高100倍...
    99+
    2023-06-17
  • 怎么提升Hive查询的执行速度
    要提升Hive查询的执行速度,可以考虑以下几点: 数据分区:根据数据的特点进行分区,可以减少查询的数据量,提高查询效率。 数...
    99+
    2024-04-03
    Hive
  • Python提高运行速度工具之Pandarallel的使用教程
    目录1.准备2.使用 Pandarallel3.注意事项众所周知,由于 GIL 的存在,Python 单进程中的所有操作都是在一个CPU核上进行的,所以为了提高运行速度,我们一般会采...
    99+
    2024-04-02
  • Python如何提高查找字串的运行速度
    这篇文章主要介绍“Python如何提高查找字串的运行速度”,在日常操作中,相信很多人在Python如何提高查找字串的运行速度问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何提高查找字串的运行速度...
    99+
    2023-06-17
  • PHP 函数性能优化:提高代码执行速度的方法
    优化 php 函数性能的有效方法包括:尽力减少函数调用频率。使用内置函数取代自定义函数。使用循环或迭代器取代递归函数。利用内置函数(如 array_map() 和 array_reduc...
    99+
    2024-04-11
    优化 php
  • 利用numba让python速度提升百倍
    目录一、什么是numba?二、numba适合科学计算三、学习使用numba四、numba让python飞起来前言; python由于它动态解释性语言的特性,跑起代码来相比java、c...
    99+
    2024-04-02
  • 怎么提高电脑的运行速度
    这篇文章主要为大家展示了“怎么提高电脑的运行速度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么提高电脑的运行速度”这篇文章吧。1.硬盘我们可以使用SSD固态硬盘作为系统盘可以让开机速度变快,...
    99+
    2023-06-28
  • 如何利用PHP索引提高响应速度?
    PHP是一种非常流行的Web编程语言,它被广泛应用于各种Web应用程序的开发中。在开发Web应用程序时,一个非常重要的问题就是如何提高响应速度,使得用户可以更快地获取到需要的信息。在这篇文章中,我们将介绍如何利用PHP索引来提高响应速度。 ...
    99+
    2023-07-01
    响应 索引 并发
  • 电脑运行速度怎么提高
    以下是一些提高电脑运行速度的方法: 清理磁盘空间:删除不需要的文件和程序,清理浏览器缓存和临时文件。 禁用启动项:禁用不必要...
    99+
    2023-10-20
    电脑
  • 如何提高电脑运行速度
    提高电脑运行速度有以下几种方法:1. 清理磁盘空间:删除不需要的文件和程序,清理临时文件,释放硬盘空间,可以提高电脑的运行速度。2....
    99+
    2023-09-07
    电脑
  • 如何大幅度提高电脑的运行速度
    要大幅度提高电脑的运行速度,可以考虑以下几个方面的优化措施:1. 清理磁盘空间:删除不需要的文件和程序,清理临时文件,释放硬盘空间。...
    99+
    2023-09-07
    电脑
  • 提高windows7系统运行速度的方法
    以下是具体的步骤:1,进入BIOS设置项目,一般的电脑都是按F12 2,确保你的电脑主板是支持AHCI。 3,在你安装Windows 7前进入bios设置,把Advanced选项中将SATA controller Mod...
    99+
    2023-06-04
    windows7系统 运行速度 方法 速度 系统 windows7
  • 怎么提高win10系统的运行速度
    提高win10系统运行速度的方法:1.右键此电脑选择属性;2.点击高级系统设置;3.点击性能设置;4.点击更改虚拟内存;5.填写初始大小和最大值;具体步骤如下:首先,在计算机桌面中右键点击“此电脑”选择“属性”选项;在弹出的系统页面中,点击...
    99+
    2024-04-02
  • 如何提高服务器运行速度
    提高服务器运行速度的方法:1、将服务器的硬件配置进行升级;2、将服务器上不必要的端口以及服务器进行关闭;3、对服务器应用程序的源代码编译进行简化;4、优化Web服务器和数据库服务器,从而加快服务器的运行速度。具体内容如下:1、硬件升级这可能...
    99+
    2024-04-02
  • 如何提高win7系统运行速度
    以下是一些建议提高Windows 7系统运行速度的方法:1. 清理磁盘空间:删除不需要的文件和程序,清理临时文件和回收站。可以使用系...
    99+
    2023-09-11
    win7
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作