年底啦,又该交年终总结了。对于码农来说,当然是关注今年新推出了哪些开源库,还有就是新近又有什么又流行又好用的好东西啦。
前两年,我们在博客贴出了Python社区里流行的好作品。现在,为2017年做个总结。
这次的榜单充满了浓浓的机器学习风,请非机器学习库的大神见谅,不过,这次我们确实有点儿偏心:)。为了公平起见,请大家在评论区为本文没有提及的优秀软件摇旗呐喊吧。
废话少说,干货来了!
1、Pipenv
第一名非它莫属,这是年初才发布一款工具,但它已经开始影响每个Python开发者的工作流了,现在连Python.org都官方推荐Pipenv作为支持库的管理工具!
Pipenv最开始不过是大神Kenneth Reitz周末搞的项目,本意是将npm或yarn这些包管理器的优势引入Python。以后再也不用virtualenv、virtualenvwrapper管理requirements.txt文件,更别提根据支持库的版本来确保复用性了(点击此处了解更多)。有了Pipenv,就不需要用命令行来增加、删除或更新支持库了,一个Pipfile文件就能搞定所有的支持库。这个工具会生成Pipfile.lock文件,确保编译的库都是最终版,还能避免因为漏掉一些边边角角的支持库而导致的bug。
当然,Pipenv还有其他不少好功能,它的文档也很赞。赶紧去了解一下,用它来支持你的Python项目吧,我们已经在Tryolabs用上啦:)
2、PyTorch
要说今年深度学习社区里面哪个库实现了大爆发,那必须是PyTorch,这个深度学习框架是Facebook今年才推出的。
PyTorch是基于流行一时的Torch框架构建和改进的,与Lua相比,它基于Python。近年来,越来越多的人开始用Python开展数据科学工作,PyTorch让深度学习更平易近人了。
值得注意的是,采用了全新动态计算图范式的PyTorch已经成为很多研究者的专用框架。使用TensorFlow、CNTK和MXNet等框架写代码时,必须先定义计算图,这个计算图指定了代码运行的所有操作,随后在框架中进行编译与优化,使它能进行GPU并行处理,运算速度更快,这种范式被称为静态计算图。它的好处在于可以利用各种优化,而且,因为构建与执行是分开进行的,此图一旦被构建即可在不同设备上运行。然而,对于诸如自然语言处理等任务,其工作量是可变的,将图片应用于算法前,可以将图片调整为固定尺寸,但是无法将不同长度的句子进行类似的处理。PyTorch和动态图的优势在于可在代码中使用标准Python控制指令,在执行指令时定义动态图,这就给了你更多自由,对于多任务,这点至关重要。
和其他现代深度学习框架一样,PyTorch还可以进行梯度计算,它的运行速度极快,还能扩展,既然如此,还不赶紧试试?
3、Caffe2
听上去有些不可思议,但Facebook今年确实还发布了另一款重磅深度学习框架。
多年前,Caffe框架就已被广泛应用,并以无可比拟的性能和通过实战检测的代码库著称。然而,深度学习的最新趋势使得这个框架在某些方向陷入了停滞。Caffe2试图将Caffe引入现代世界。
它支持分布式训练及部署,包括多种移动平台、最新的CPU与CUDA适配的硬件。PyTorch更适合研究,Caffe2则适用于Facebook那种大规模部署。
还可以了解一下ONNX(微软与Facebook共同推出的开源项目,全称为Open Neural Network Exchange”) 近期的努力。用PyTorch构建和训练模型,再用Caffe2进行部署,是不是挺棒?
4、Pendulum
去年,Arrow荣登本榜,这个库可以让Python更简单地处理datetimes。今年,轮到Pendulum了。
Pendulum的一大优势是内嵌式取代Python的datetime类,可以轻易地将它整合进已有代码,并且只在需要的时候才进行调用。作者精心调校了时区,确保时区准确,让每个实例都对能区分时区,默认使用UTC。还有就是提供了扩展的timedelta,使datetime计算更加容易。
与其他库不同,它提供了可预测行为的API,这样就可以知道后面会发生什么。如果正开发使用datetimes的复杂项目,这个库能让你更轻松!想要了解更多,请查阅文档。
5、Dash
从事数据科学工作,少不了使用Pandas、scikit-learn这些Python生态系统中的利器,还有就是控制工作流的Jupyter Notebooks,毋庸置疑,大家都爱用这些工具。但是,要想将工作成果分享给不会用这些工具的人,那该怎么办?怎么才能构建一个人人都能够轻松上手的界面,操控数据和可视化?以前,为实现这一目的,需要一个精通Javascript的专职前端团队来搭建GUI,以后就用不着啦。
今年发布的Dash是在纯Python环境中构建数据可视化Web APP的开源库。该库基于Flask、Plotly.js和React构建,提供抽象层,无需学习上述框架即可快速上手开发。它在浏览器中进行渲染和响应,因此还适用移动端。
如果你想知道Dash都能实现什么效果,这个样例库可以让你大饱眼福。
6、PyFlux
很多Python库都适用于数据科学和机器学习,但当数据点是随着时间进化的矩阵时,比如股价或从设备获取的测量数据等,这就是另一回事儿了。
PyFlux是专门处理时间序列的Python开源库。时间序列是统计学与计量经济学的子域,其目标是描述时间序列行为(主要是关于潜在成分或利息特征),并且预测未来它们如何演化。
PyFlux允许通过概率方式进行时间序列建模,并且实现了几个像GARCH这样的现代时间序列模型。是个不错的好东西。
7、Fire
做项目的时候经常需要制作命令行界面(Command Line Interface~CLI)。除了传统的argparse,Python还有类似click或docopt等工具。谷歌今年发布的Fire,使用另一个视角来解决同样的问题。
Fire是一个为任意Python项目自动生成命令行界面的开源库。请注意,重点是自动构建命令行界面,基本上不用再写代码或文档说明啦。只要调用一个Fire方法,把它传输给需要生成命令行界面的内容即可,比如,函数、对象、类、字典,就算没有参数都可以,这样Fire就会为所有代码生成一个命令行界面(CLI)。
请仔细阅读此指南,通过例子理解它如何运作。密切关注这个库,它绝对能给你节省不少时间。
8、imbalance-learn
理想状态下,我们有均衡的数据集可以用来训练模型,一切都很如意。可惜,真实世界不是这样的,现实任务更多是非均衡数据。比如,在预测伪造信用卡交易时,预期超过99.9%的绝大多数交易是合法的。如果只是训练朴素机器学习算法会让你很糟心,因此需要格外关注这类数据集。
好在这个问题已经解决了,还有各种不同的技术解决方案。Imbalanced-learn 这个Python包提供了多种技术解决方案,可以让开发工作变得更轻松。它与scikit-learn兼容,并且是scikit-learn-contrib项目的一部分。有用!
9、FlashText
一般来说,查找或替换文本可以使用正则表达式。正则表达式能妥妥的完成这项任务。但是,需要查找几千个术语时,正则表达式就慢死了。
FlashText能够更好地解决这个问题。在作者最初的基准测试中,它大幅提高了整个操作运行时间,从5天缩减到5分钟。
FlashText的美妙之处在于不论查找多少术语,其运行时间都是一样的,而正则表达式的运行时间则会随着术语数量的增加而线性增加。
FlashText证明了算法和数据结构设计的重要性,由此可知,即便是简单的问题,更好的算法也可以比更强的CPU有效。
10、Luminoth
声明:本库是由Tryolab研发中心开发的。
当今世界图片满天飞,一些APP急需理解这些图片的内容。多亏深度学习技术的发展,图像处理技术也取得了长足的进步。
Luminoth是基于TensorFlow和Sonnet构建的计算机视觉处理工具箱。目前,它通过快速R-CNN模型支持对象检测。
Luminoth不仅实现了这个特定模型,它还是基于模块化构建的,可以扩展。因此,自定义现有组件或结合新的模型来解决复杂问题是可行的,好好复用这些代码吧。在构建深度学习模型时,它提供了必要的开发工具:转换图像数据为适用的格式,以供数据管道(TensorFlow的tfrecords)处理,进行数据增强,在一个或多个GPU上进行训练(在处理大型数据集时,必须使用分布式训练),运行评估指标,轻松地在TensorFlow中实现可视化,通过简单的API或浏览器界面部署训练模型,供人操作。
还有,Luminoth可以很简单地整合谷歌云机器学习引擎,就算你没有强大的GPU,也可以和在本机一样,轻松一个指令就能在云端进行模型训练。
如果你对此感兴趣,可以阅读发布博文或观看我们在ODSC上的访谈视频来了解更多信详情。
更多优秀库:这些也不错
PyVips
可能你从没听说过libvips这个库,这么说吧,它是个像Pillow或ImageMagick这样的图像处理库,并且支持很多图片格式。然而,和其他库相比,libvips更快,占用内存更少。比如说,基准测试显示它比ImageMagick快3倍,占用内存仅为1/15。有关libvips的优势,请点此查阅。
PyVips是近期发布的Python版libvips,兼容Python2.7和3.6,还有PyPy。使用pip安装,内嵌式兼容绑定的老版本,无需修改代码。
如果在APP中进行图像处理,那一定要关注它。
Requestium
声明:本库为Tryolabs发布。
有时,你可能会在网上实现一些自动化操作。比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要。Python提供了非常优秀的Requests库可以辅助进行这些操作。可惜,很多网站采用基于JavaScript的重客户端,这就意味着Requests获取的HTML代码中根本就没有用来自动化操作的表单,更别提自动填表了!它取回的基本上都是React或Vue这些现代前端库在浏览器中生成的空DIV这类的代码。
虽然可以通过反向工程处理JavaScript生成的代码,但这需要花几个小时来编译。处理这些丑陋的JS代码,谢谢,还是算了吧。还有一个方法就是使用Selenium库,允许以程序化的方式和浏览器进行交互,并运行JavaScript代码。用了这个库就没什么问题了,但它比占用资源极少的Requests慢太多了。
如果能以Requests为主,只在需要Selenium的时候才无缝调用,这样不是更好?看看Requestium吧,它以内嵌方式取代Requests,而且干的不错。它整合了Parsel,用它编写的页面查询元素选择器代码特别清晰,它还为诸如点击元素和在DOM中渲染内容这些通用操作提供了帮助。又一个网页自动化省时利器!
skorch
喜欢scikit-learn的API,但又得用PyTorch干活儿?别担心,skorch这个打包器为PyTorch提供了像sklearn一样的界面。只要你熟悉这些库,一定会觉得它的句法直白易懂。有了skorch,就可以将一些代码抽象化,从而把精力集中在真正重要的事上,比如干点儿数据科学的事儿。
结论
今年!如果你认为还有别的库也可以上榜,赶紧在去评论区里发表意见吧,这世界变化太快,我们也有些跟不上潮流啦。最后,再次感谢社区中每个人所做的贡献!
最后,别忘了订阅我们的简报,不要错过我们的机器学习内容哦。