“人生苦短,我用Python”,说的就是Python开发“快”的优势,相同的代码量能够完成其他语言数倍代码量 的任务。一般情况下,像C++、C、JAVA 、GO这类编译型语言要比PHP、Python、JavaScript这类解释性语言要快一些,但是各有各的优势。
Python以其开发方便、语言生态健全,乘着人工智能之风很快成为了一门明星语言。使用Python提升开发效率的同时,代码的运行效率却没那么高。下面将介绍几种简单的方法,尝试提升代码的可读性、执行效率。
![](https://img.haomeiwen.com/i6620012/01f7ff5268285a22.jpeg)
一、优化编程惯例
1)用生成式生成列表:
假设我们正在编写爬虫,现在需要将解析到的信息生成列表。
不优雅的方法:
![](https://img.haomeiwen.com/i6620012/fad365672524836c.png)
得到:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
用生成式更加优雅的完成:
![](https://img.haomeiwen.com/i6620012/ec05cfc114176c8f.png)
输出:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
2)使用enumerate进行迭代:
enumerate方法用于将一个可遍历的数据对象组合为一个索引序列,同时输出数据和数据下标,一般用于for循环之中,演示如下:
不优雅的方法:
![](https://img.haomeiwen.com/i6620012/1106b5054b094726.png)
输出:
![](https://img.haomeiwen.com/i6620012/55ee2d9b86cfa036.png)
优雅的方法,使用enumerate函数:
![](https://img.haomeiwen.com/i6620012/cae8d788de79ff28.png)
3)用join方法生成字符串:
join()函数能够将序列中的元素按照给定的字符链接生成一个新的字符串。
不好的代码:
![](https://img.haomeiwen.com/i6620012/538cab1b0f1fd7cd.png)
输出:我-在-知-了-课-堂-学-Python-
使用join方法:
![](https://img.haomeiwen.com/i6620012/269a9e49596c85a2.png)
输出:我-在-知-了-课-堂-学-Python
4)不适用临时变量交换两个值:
![](https://img.haomeiwen.com/i6620012/c238afe0da96f08f.png)
5)使用:
![](https://img.haomeiwen.com/i6620012/510d58262cac807a.png)
二、使用Cython模块提升代码执行速度
Python有着良好的扩展性与接口功能,人工智能大多数库都是C++或者C写来由Python调用。大公司会使用Python来提升开发效率,用C来弥补性能缺口。在Python官方文档中,也给出了Python的C API接口的文档,但是下面也标注了“给 C/C++ 程序员的参考手册”,绝非等闲之辈能轻易掌握!好消息是,有Cython模块,官方是这样介绍的(翻译):
[Cython]是一种编程语言,它使编写Python语言的C扩展与Python本身一样容易。它旨在成为[Python]语言的超集,从而为它提供高级,面向对象,功能和动态编程。
Cython是Python编译器。这意味着它可以编译普通的Python代码而无需进行更改(除了一些尚不支持的语言功能的明显例外),接下来使用Cython提升Python执行速度。
![](https://img.haomeiwen.com/i6620012/9f03350eecfe4b3b.png)
1)安装:
使用cython最简单的方法是执行
![](https://img.haomeiwen.com/i6620012/e7ff864e3aa45e0e.png)
也可以从https://cython.org/下载最新版本 。解压缩tarball或zip文件,输入目录,然后运行:
![](https://img.haomeiwen.com/i6620012/394281357271765b.png)
另外需要安装gcc,linux下一般自带。
2)Hello, Cython:
使用官方推荐的方法(使用setuptools)构建我们的代码,
创建hello.pyx文件(你没看错,不是.py而是.pyx)并键入:
![](https://img.haomeiwen.com/i6620012/813ea6c2e009f2f0.png)
创建对应的setup.py脚本:
![](https://img.haomeiwen.com/i6620012/38ada418ce9cc7b2.png)
cmd到当前目录,执行:
![](https://img.haomeiwen.com/i6620012/1cbfce3fa5bdd23d.png)
![](https://img.haomeiwen.com/i6620012/7846b0f8e33c2e50.png)
gcc与g++都安装但是,报错,缺乏 Microsoft visual C++ 14.0,遂下载安装:
![](https://img.haomeiwen.com/i6620012/e4748527598ab556.png)
4GB!太大了,用linux试试!
在centos环境下,重复上述步骤:
![](https://img.haomeiwen.com/i6620012/d7e0baa6834df07e.png)
成功,并且生成了一个hello.cpython-36m-x86_64-linux-gnu.so文件, 在Windows下会生成.pyd文件。
使用:
![](https://img.haomeiwen.com/i6620012/5f9dbe1e39e49f43.png)
![](https://img.haomeiwen.com/i6620012/c3158c002e102991.png)
hon VS Python :
斐波那契数列,通俗易懂,使用Python容易实现,也考验计算能力。我们分别用Python和cython来计算斐波那契第38项的值,同一台机器,看谁算的快!
使用Python:
创建fib1.py并键入:
![](https://img.haomeiwen.com/i6620012/deec132a9fe57702.png)
成绩:11.73秒
![](https://img.haomeiwen.com/i6620012/e4cd2c7007c0bfd5.png)
使用Cython:
创建一个fib2.pyx并键入:
![](https://img.haomeiwen.com/i6620012/cf04fe017a840666.png)
创建相应的setup.py:
![](https://img.haomeiwen.com/i6620012/4d6e2941a0b627d6.png)
执行:
![](https://img.haomeiwen.com/i6620012/200ba0e329d6b5e9.png)
建立测试文件test.py:
![](https://img.haomeiwen.com/i6620012/75559bbe4a960dd2.png)
成绩,2.20秒
![](https://img.haomeiwen.com/i6620012/1a3e00662a460c2e.png)
awesome!快了5倍多,实际上随着项的增大,成绩还会有所提升。
使用cython不仅能够大幅提升代码的运行速度,还能够起到加密核心代码的作用,即便是被对手入侵了服务器,也不必担心核心代码泄露。
三、使用科学计算库
知名的科学计算库如numpy、pandas等底层都使用C++、C完成,这在一定程度上保证了执行速度,另一方面也能帮助我们提升可读性。
我们分别用numpy和传统的**方法来计算一个数组的乘方,
![](https://img.haomeiwen.com/i6620012/f590a492df36ebf9.png)
很给力,快了数倍:
![](https://img.haomeiwen.com/i6620012/18c56210649bca30.png)
相信,不断的优化我们的编程习惯,像写诗一样写代码,养成良好科学的计算习惯,一定能够写出pythonic代码!
更多干货内容,欢迎关注公众号:知了python
网友评论