如何将Python自然语言处理速度提升100倍:用spaCy/Cython加速NLP

在这里插入图片描述
AI前线导读:去年我们发布了基于 Python 的共指解析包之后,社区反馈非常热烈,大家开始在各式应用中使用它,有些应用场景与我们原来的对话用例非常不一样。

之后我们发现,虽然这个解析包的性能对于对话消息来说是足够的,但涉及到大篇幅新闻文章时就远远不够了。

更多干货内容请关注微信公众号“AI前线”,(ID:ai-front)所以我决定好好处理这个问题,最后开发出了比之前版本(每秒几千单词)性能提升百倍的 NeuralCoref v3.0(https://github.com/huggingface/neuralcoref) ,同时还保持了同样水准的准确性和易用性。
本文中,我会分享在这个项目上总结的一些经验,重点包括:

怎样在 Python 中 设计一个高效率的模块。
怎样 充分利用 spaCy 的内部数据结构来快速设计极高性能的 NLP函数。**
这里我耍了点小花招,因为我们既要谈论 Python,同时还会涉及一些 Cython 内容——不过 Cython 是 Python 的一个超集(http://cython.org/) ,所以不要担心!
你现在写的 Python 程序已经是一个 Cython 程序了。
下面的一些场景可能对速度有很高的要求:

你正在使用 Python为 NLP 开发一个 生产模块;
你正在使用 Python 对一个大型 NLP 数据集进行 计算分析;
你正在为诸如 pyTorch/TensorFlow 这类深度学习框架 预处理大型训练集,或者深度学习模型采用的 批处理加载器加载了太多复杂逻辑,严重拖慢了训练速度。
开始之前再提一句,我还发布了一个 Jupyter notebook(https://github.com/huggingface/100-times-faster-nlp),其中包含了本文中讨论的所有示例,去试试吧!
性能飞跃的第一步:性能分析

首先你要知道,你的大部分代码在纯 Python 环境下可能都运行良好,但是其中存在一些 瓶颈函数,如果好好处理它们,运行速度就能提升一个数量级。
所以,应该首先检查你的 Python 代码,找出那些影响性能的部分。其中一种方法就是使用 cProfile(https://docs.python.org/3/library/profile.html) ,像这样:

你可能会发现影响性能的是一些循环或者使用神经网络时引入的 Numpy 数组操作。
那么该如何加速这些循环?
使用 Cython来加速 Python循环

让我们通过一个简单的例子来解决这个问题。假设有一堆矩形,我们将它们存储成一个由 Python 对象(例如 Rectangle类实例)构成的列表。我们的模块的主要功能是对该列表进行迭代运算,从而统计出有多少个矩形的面积是大于所设定阈值的。
我们的 Python 模块非常简单,看起来像这样:

这个 check_rectangles 函数就是我们的瓶颈所在!它对大量 Python 对象进行循环检查,而因为 Python 解释器在每次迭代中都要做很多工作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值