python应用笔记之ctypes加快crc32计算

本文介绍了如何通过ctypes库在Python中调用C/C++编写的CRC32计算函数,以提高代码执行效率,特别适用于处理大数据或对性能有高要求的场景。
摘要由CSDN通过智能技术生成

        python虽然拥有强大的生态库,但是其解释型编程风格,使得代码运行效率相对于C语言低很多;在一些对运行性能要求高的工程,其弊端就表现的很明显。这里介绍一种用ctypes标准库实现代码运行速度的方法。下面就以计算CRC32为例。

1、编写crc32函数

        用C语言或C++或C#编写crc32程序,假设编写的函数为

uint32_t CRC32_Calc(uint8_t *pDataAddr, uint32_t length)

        其中*pDataAddr表示要计算crc32的数据地址,length表示要计算crc32的数据长度,函数返回32bits的crc值;具体的crc32实现代码,网上很多;

2、生成DLL文件

        用相关手段,将上述的代码(包括.c和.h文件)生成crc32_lib.so或者crc32_lib.dll等库文件;

3、python通过ctypes调用库文件

import os, ctypes

path_python = os.path.split(os.path.realpath(__file__))[0]

crc32_lib = ctypes.cdll.LoadLibbrary(os.path.join(path_python, "\\crc32_lib.dll"))

CRC32_CALC = crc32_lib.CRC32_Calc

CRC32_CALC.argtypes = [ctypes.c_char_p, ctypes.c_uint32]

CRC32_CALC.restype = ctypes.c_uint32

代码介绍:

1)path_python = os.path.split(os.path.realpath(__file__))[0],表示获取当前python脚本的文件路径,用于获取dll文件的路径;

2)crc32_lib = ctypes.cdll.LoadLibbrary(os.path.join(path_python, "\\crc32_lib.dll")),先用os.path.join获取dll完整的路径,再用ctypes.cdll.LoadLibbrary导入库文件;

3)CRC32_CALC = crc32_lib.CRC32_Calc,定义计算crc32函数名;

4)最后2行代码生命函数的输入形参数据类型和函数返回数据类型;

4、封装成python函数

def crc32_update(data, size):

    if type(data) == bytearray:

        data = bytes(data)


     return CRC32_CALC(data, size)

5、代码调用

# 定义生成16进制的数组
def byteArray_gen(byte_len, hex_val) -> bytearray():
    a_byte = hex_val.to_bytes(length=1, byteorder='little')
    null_data = bytearray(byte_len)

    i = 0
    while i < byte_len:
        null_data[i] = a_byte[0]
        i += 1
    
    return null_data

# 计算crc32
magic_size = 256
magic_array = byteArray_gen(self.magic_size, 0xFF)

hw_crc = crc32_update(magic_array, magic_size)

        按照上述方式,python可通过调用C语言或C++语言或C#语言编写的crc32函数生成的库文件,快速计算数据的crc32值;特别是对于以MB或GB为单位的数据,计算效率显而易见。

总结

        上述简单列举以计算crc32的值为例,介绍python如何通过调用C语言等生成的库文件,加快程序的运行时间,特别是针对一些大数据或复杂算法的计算,效果明显。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔二叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值