Python进阶:使用ctypes将Python运行速度提升30倍
HackPython致力于有趣有价值的编程教学
简介
当Python面临运算密集型任务时,其速度总是显得力不从心。要提升Python代码运行速度有多种方法,如ctypes、cython、CFFI等,本篇文章主要从ctypes方面介绍如何提升Python的运行速度?。
ctypes是Python的内置库,利用ctypes可以调用C/C++编译成的so或dll文件(so存在linux/MacOS中,dll存在于windows)?,简单而言,就是将计算压力较大的逻辑利用C/C++来实现,然后编译成so或dll文件,再利用ctypes加载进Python,从而将计算压力大、耗时较长的逻辑交于C/C++去执行。如Numpy、Pandas这些库其底层其实都是C/C++来实现的?。
下面代码的运行环境为:MacOS 、 Python3.7.3
纯Python实现
为了对比出使用ctypes后程序运行速度的变化,先使用纯Python代码实现一段逻辑,然后再利用C语言去实现相同的逻辑?。
这里为了模仿运算密集任务,实现一段逻辑用于计算一个集合中点与点之间的距离以及实现一个操作字符串的逻辑,具体代码如下:
import random
import time
# 点
class Point():
def __init__(self, x, y):
self.x = x
self.y = y
class Test():
def __init__(self, string, nb):
self.string = string
self.points = []
# 初始化点集合
for i in range(nb):
self.points.append(Point(random.random(), random.random()))
self.distances = []
# 增量字符串
def increment_string(self, n):
tmp = ""
# 每个字符做一次偏移
for c in self.string:
tmp += chr(ord(c) + n)
self.string = tmp
# 这个函数计算列表中每个点之间的距离
def distance_between_points(self):
for i, a in enumerate(self.points):
for b in self.points:
# 距离公式
self.distances.append(((b.x - a.x) ** 2