所有由Python实用宝典发布的文章

Python 世界上最简单的面部识别api 源代码下载

[download_code]

Face Recognition 世界上最简单的Python面部识别api

译者注:

本项目face_recognition是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统。

为了便于中国开发者研究学习人脸识别、贡献代码,我将本项目README文件翻译成中文。

向本项目的所有贡献者致敬。

英译汉:同济大学开源软件协会 子豪兄Tommy

Translator’s note:

face_recognition is a powerful, simple and easy-to-use face recognition open source project with complete development documents and application cases, especially it is compatible with Raspberry Pi.

In order to facilitate Chinese software developers to learn, make progress in face recognition development and source code contributions, I translated README file into simplified Chinese.

Salute to all contributors to this project.

Translator: Tommy in Tongji Univerisity Opensource Association 子豪兄Tommy

本项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取、识别、操作人脸。

本项目的人脸识别是基于业内领先的C++开源库 dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。

Labeled Faces in the Wild是美国麻省大学安姆斯特分校(University of Massachusetts Amherst)制作的人脸数据集,该数据集包含了从网络收集的13,000多张面部图像。

本项目提供了简易的face_recognition命令行工具,你可以用它处理整个文件夹里的图片。

  

特性

从图片里找到人脸

定位图片中的所有人脸:

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)

识别人脸关键点

识别人脸关键点,包括眼睛、鼻子、嘴和下巴。

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

识别人脸关键点在很多领域都有用处,但同样你也可以把这个功能玩坏,比如本项目的 digital make-up自动化妆案例(就像美图秀秀一样)。

识别图片中的人是谁

import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")

biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

results = face_recognition.compare_faces([biden_encoding], unknown_encoding)

你也可以配合其它的Python库(比如opencv)实现实时人脸检测:

看这个案例 实时人脸检测 。

安装

环境配置

  • Python 3.3+ or Python 2.7
  • macOS or Linux
  • Windows并不是我们官方支持的,但也许也能用

不同操作系统的安装方法

在 Mac 或者 Linux上安装本项目

First, make sure you have dlib already installed with Python bindings:

第一步,安装dlib和相关Python依赖:

Then, install this module from pypi using pip3 (or pip2 for Python 2):

pip3 install face_recognition

如果你遇到了幺蛾子,可以用Ubuntu虚拟机安装本项目,看下面这个教程。 如何使用Adam Geitgey大神提供的Ubuntu虚拟机镜像文件安装配置虚拟机,本项目已经包含在镜像中.

在 Mac 或者 Linux上安装本项目 2

修改你的pip镜像源为清华镜像,然后使用pip install face_recognition,可以自动帮你安装各种依赖,包括dlib。只是在安装dlib的时候可能会出问题,因为dlib需要编译,出现的问题一般是gcc或者g++版本的问题,所以在pip install face_recognition之前,可以通过在命令行键入

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++  

来指定你gcc和g++对应的位置,(这两句话会临时修改当前终端的环境变量/usr/local/bin/gcc对应你自己gcc或者g++所在目录)。

在树莓派上安装

在Windows上安装

虽然本项目官方并不支持Windows,但一些大神们摸索出了在Windows上运行本项目的方法:

使用Ubuntu虚拟机镜像文件安装配置虚拟机,本项目已经包含在这个镜像中

使用方法

命令行界面

当你安装好了本项目,你可以使用两种命令行工具:

  • face_recognition – 在单张图片或一个图片文件夹中认出是谁的脸。
  • face_detection – 在单张图片或一个图片文件夹中定位人脸位置。

face_recognition 命令行工具

face_recognition命令行工具可以在单张图片或一个图片文件夹中认出是谁的脸。

首先,你得有一个你已经知道名字的人脸图片文件夹,一个人一张图,图片的文件名即为对应的人的名字:

然后,你需要第二个图片文件夹,文件夹里面是你希望识别的图片:

然后,你在命令行中切换到这两个文件夹所在路径,然后使用face_recognition命令行,传入这两个图片文件夹,然后就会输出未知图片中人的名字:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

输出结果的每一行对应着图片中的一张脸,图片名字和对应人脸识别结果用逗号分开。

如果结果输出了unknown_person,那么代表这张脸没有对应上已知人脸图片文件夹中的任何一个人。

face_detection 命令行工具

face_detection命令行工具可以在单张图片或一个图片文件夹中定位人脸位置(输出像素点坐标)。

在命令行中使用face_detection,传入一个图片文件夹或单张图片文件来进行人脸位置检测:

$ face_detection  ./folder_with_pictures/

examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792

输出结果的每一行都对应图片中的一张脸,输出坐标代表着这张脸的上、右、下、左像素点坐标。

调整人脸识别的容错率和敏感度

如果一张脸识别出不止一个结果,那么这意味着他和其他人长的太像了(本项目对于小孩和亚洲人的人脸识别准确率有待提升)。你可以把容错率调低一些,使识别结果更加严格。

通过传入参数 --tolerance 来实现这个功能,默认的容错率是0.6,容错率越低,识别越严格准确。

$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

如果你想看人脸匹配的具体数值,可以传入参数 --show-distance true

$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
更多的例子

如果你并不在乎图片的文件名,只想知道文件夹中的图片里有谁,可以用这个管道命令:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
加速人脸识别运算

如果你的CPU是多核的,你可以通过并行运算加速人脸识别。例如,如果你的CPU有四个核心,那么你可以通过并行运算提升大概四倍的运算速度。

如果你使用Python3.4或更新的版本,可以传入 --cpus <number_of_cpu_cores_to_use> 参数:

$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/

你可以传入 --cpus -1参数来调用cpu的所有核心。

子豪兄批注:树莓派3B有4个CPU核心,传入多核参数可以显著提升图片识别的速度(亲测)。

Python 模块:face_recognition

在Python中,你可以导入face_recognition模块,调用我们提供的丰富的API接口,用几行代码就可以轻松玩转各种人脸识别功能!

API 接口文档: https://face-recognition.readthedocs.io

在图片中定位人脸的位置
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)

# face_locations is now an array listing the co-ordinates of each face!

看 案例:定位拜登的脸

你也可以使用深度学习模型达到更加精准的人脸定位。

注意:这种方法需要GPU加速(通过英伟达显卡的CUDA库驱动),你在编译安装dlib的时候也需要开启CUDA支持。

import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")

# face_locations is now an array listing the co-ordinates of each face!

看 案例:使用卷积神经网络深度学习模型定位拜登的脸

如果你有很多图片需要识别,同时又有GPU,那么你可以参考这个例子:案例:使用卷积神经网络深度学习模型批量识别图片中的人脸.

识别单张图片中人脸的关键点
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.

看这个案例 案例:提取奥巴马和拜登的面部关键点 

识别图片中的人是谁
import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`!

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

看这个案例 案例:是奥巴马还是拜登?

Python 案例

所有案例都在这个链接中 也就是examples文件夹.

人脸定位

人脸关键点识别

人脸识别

关于 face_recognition的文章和教程

人脸识别的原理

如果你想更深入了解人脸识别这个黑箱的原理 读这篇文章

子豪兄批注:一定要看这篇文章,讲的既有趣又有料。

警告说明

  • 本项目的人脸识别模型是基于成年人的,在孩子身上效果可能一般。如果图片中有孩子的话,建议把临界值设为0.6.
  • 不同人种的识别结果可能不同, 看wiki百科页面 查看更多细节。

把本项目部署在云服务器上 (Heroku, AWS等)

本项目是基于C++库dlib的,所以把本项目部署在Heroku或者AWS的云端服务器上是很明智的。

为了简化这个过程,有一个Dockerfile案例,教你怎么把face_recognition开发的app封装成Docker 容器文件,你可以把它部署在所以支持Docker镜像文件的云服务上。

出了幺蛾子?

如果出了问题,请在Github提交Issue之前查看 常见错误 。

鸣谢

  • 非常感谢 Davis King (@nulhom)创建了dlib库,提供了响应的人脸关键点检测和人脸编码相关的模型,你可以查看 blog post这个网页获取更多有关ResNet的信息。
  • 感谢每一个相关Python模块(包括numpy,scipy,scikit-image,pillow等)的贡献者。
  • 感谢 Cookiecutter 和audreyr/cookiecutter-pypackage 项目模板,使得Python的打包方式更容易接受。

7行代码 Python热力图可视化分析缺失数据处理

Python热力图寻找缺失数据

你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢?当然如果你的Excel水平非常高,这个可能不会成为你的问题,但如果当你想可视化出每一列缺失数据的分布和数量怎么办呢?这时候就需要用Python绘制热力图了!

1.安装所需要的第三方Python

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install seaborn
pip install pandas
pip install matplotlib

其中pandas是用于数据操作与处理的,matplotlib和seaborn主要用于Python数据可视化,也就是绘制我们所需要的热力图。

2.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')

没错,pandas的使用就这么简单,读取csv文件直接使用read_csv函数,你可以使用自己需要的csv文件,也可以使用我们提供的:点击下载 Python推特机器人分类数据集 中的training_data.csv,只需要你移动到当前代码的文件夹下即可。

3.Python构造热力图

使用Python构造热力图识别表格的缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python热力图寻找缺失数据

seaborn.heatmap用于生成热力图,其会检查data中的每个单元格,如果为空则标记为黄色,cmap为颜色图谱,viridis即蓝-绿-黄. 此外,matplotlib.pyplot主要用于负责展示图片。如果你需要知道seaborn更详细的参数文档,可以阅读这篇文章

整体代码如下(一共只用了7行

import pandas as pd
import seaborn
import matplotlib
data = pd.read_csv('training_data.csv')
seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 深度学习图像风格迁移 源代码下载

[download_code]

准备

此代码基于pytorch。它已经在Ubuntu 14.04 LTS上进行了测试。

依赖关系:

CUDA后端:

下载VGG-19:

sh models/download_models.sh

编译cuda_utils.cumakefile为您的机器调整PREFIX以及NVCC_PREFIX):

make clean && make

用法

快速开始

使用提供的脚本生成所有(examples/)结果,只需在Matlab或Octave运行

run('gen_laplacian/gen_laplacian.m')

然后在Python中:

python gen_all.py

最终输出在examples/final_results/

基本用法

  1. 给定具有语义分割掩码的输入和样式图像,以下文件名格式分别将它们放入examples/examples/input/in<id>.pngexamples/style/tar<id>.pngexamples/segmentation/in<id>.pngexamples/segmentation/tar<id>.png;
  2. 使用gen_laplacian/gen_laplacian.mMatlab 计算消光拉普拉斯矩阵。输出矩阵将具有以下文件名形式:gen_laplacian/Input_Laplacian_3x3_1e-7_CSR<id>.mat;

注意:请确保内容图像分辨率与Matlab中的Matting Laplacian计算和Torch中的样式传输一致,否则结果将不正确。

  1. 运行以下脚本以生成分段中间结果:

th neuralstyle_seg.lua -content_image <input> -style_image <style> -content_seg <inputMask> -style_seg <styleMask> -index <id> -serial <intermediate_folder>

  1. 运行以下脚本以生成最终结果:

th deepmatting_seg.lua -content_image <input> -style_image <style> -content_seg <inputMask> -style_seg <styleMask> -index <id> -init_image <intermediate_folder/out<id>_t_1000.png> -serial <final_folder> -f_radius 15 -f_edge 0.01

可以传递-backend cudnn-cudnn_autotune两者Lua脚本(步骤3和4),以潜在地提高速度和内存使用情况。libcudnn.so必须在你的LD_LIBRARY_PATH。这需要cudnn.torch

图像分割

注意:在论文中,我们使用从DilatedNet修改的自动场景分割算法生成所有比较结果。手动分割可以实现更多样化的任务,因此我们提供了掩模examples/segmentation/

我们使用的蒙版颜色(您可以ExtractMask在两个*.lua文件中添加更多颜色):

颜色变量 RGB值 十六进制值
blue 0 0 255 0000ff
green 0 255 0 00ff00
black 0 0 0 000000
white 255 255 255 ffffff
red 255 0 0 ff0000
yellow 255 255 0 ffff00
grey 128 128 128 808080
lightblue 0 255 255 00ffff
purple 255 0 255 ff00ff

 

例子

以下是算法的一些结果(从左到右分别是输入,样式和输出):

 

Python 监控Github项目更新并自动下载

如果你有自己在本地维护一个开源代码,你就会知道检测这些是否更新了是多麻烦的一件事情。随着库的增大,人工维护成本也就越来越大。因此便有了这个项目的想法:让我们用Python监控Github项目是否有更新,如果有的话自动下载该更新

1.统一文件名格式

为了能够获取github上的项目的更新时间,我们需要调用github的一个API:

https://api.github.com/repos/用户名/库名

可以看到,这个API由 用户名/名 组成,因此我们的文件名应该以它为标准才能方便API的调用,由于文件名不可以带有 ‘/’ 这样的特殊符号,因此我们改为下划线分割,如FastText项目调用API的时候为:

https://api.github.com/repos/facebookresearch/fastText

我们保存的文件名则为 facebookresearch_fastText.zip 这样,在调用API、下载文件的时候将会方便许多

2.获得文件夹里的所有文件名及其最后修改时间

为了判断github上的项目是否相对于本地有更新,我们需要获得每一个本地的文件的最后修改时间,因此这是一个字典关系。代码如下:

3.与Github线上项目对比更新时间

首先我们要通过调用我们前面说提到的API 获取github线上项目的时间。其次,一定要将其格式化为10位时间戳,因为我们第二步获得的时间也是10位时间戳,这样对比起来非常方便。最后返回的时候只需要返回是否需要更新即可。如图所示。

github update time

代码如下:

4.如果有需要更新的项目,让其自动下载

由于许多github项目文件压缩包都挺大的,我们这里采用了流式下载。如果你的项目特别多,你需要更快地进行下载,请采用批量异步下载。在我们之前的那篇文章里都有,点击即可阅读

5. 整套流程

我们把已经下载好的项目文件放在libs文件夹里,自动下载得到的文件放置在new文件夹中。文件结构如下:

F:\pythondict\pythondict-downloads\
│ superviser.py

├─libs
│ facebookresearch_fastText.zip
│ facebookresearch_MUSE.zip

└─new

整套代码如下,为了防范盗取文章的家伙,原谅我这里是图片的格式,如果需要下载请点击这里

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

让python运行地超快的10个方法

大部门人使用python是因为它非常方便,而不是因为它速度快。过多的第三方使得python相比于Java和C的性能差距较大。但也是可以理解的,因为在大部分情况下,开发速度优先于执行速度。

但也不要过于担心python的速度,这并不一定是一个非此即彼的命题。经过适当优化,Python应用程序可以以惊人的速度运行——也许还不能达到Java或C语言的速度,但是对于Web应用程序、数据分析、管理和自动化工具以及大多数其他用途来说,速度已经足够快了。快到你可能会忘记了你是在用应用程序性能换取开发人员的生产力。

优化Python性能不能单从一个角度上看。而是应用所有可用的优化方法,并选择最适合当前场景的多种方法的集合。(Dropbox的员工有一个最令人瞠目的例子,展示了python优化的强大功能,点击链接查看。)

在本文中,我将简单讲述许多常见的python优化方法。有些是临时措施,只需要简单地将一项转换为另一项(例如更换Python解释器),但是那些带来最大收益的方法将需要更详细的工作。

1. 算速度、算速度、算速度!

如果你不能够找出速度慢的原因所在,你就不能确定你的python应用程序为什么运行地不够理想

计算的方法有很多,你可以尝试python内置的 cProfile模块 进行简单的计算分析,如果需要更高的精度(计算每行语句运行时间),可以使用 line_profiler 第三方工具。通常而言,从计算程序的函数运行时间进行分析就能够给你提供改进方案,所以推荐使用 profilehooks 第三方,它能计算单个函数的运行时间。

你可能需要更多的挖掘才能发现为什么你的程序某个地方这么慢、怎么修复它。重点在于缩小你的排查范围,逐渐细化到某条语句上。

2.缓存需要重复使用的数据

当你可以把需要计算出来的数据保存下来的时候,千万不要重复上千次去计算它。如果你有一个经常需要使用的函数,而且返回的是可预测的结果,Python已经给你提供了一个选项,能将其缓存到内存中。后续的函数调用如果是一样的,将立即返回结果。

有许多方法都可以做到,比如说:使用python的一个本地:functools,拥有一个装饰器,叫@functools.lru_cache,它能够缓存函数最近的N个调用,当缓存的值在特定时间内保持不变的时候这个非常好用,比如说列出最近一天使用的物品。

3.将数学计算重构为NumPy

如果你的Python程序中有基于矩阵或数组的数学运算,并且希望更高效地对它们进行计算,那么你就应该使用NumPy,因为它通过使用C来完成繁重的工作,比原生python解释器能更快得处理数组,而且能比Python内置数据结构更有效地存储数字数据。

NumPy还可以极大地加速相对普通的数学运算。该包为许多常见的Python数学操作(如min和max)提供了替换,这些操作的速度比原始Python快很多倍。

NumPy的另一个优点是对大型对象(比如包含数百万项的列表)能更有效地使用内存。一般来说,如果用传统的Python表示类似于NumPy中的大型对象,那么它们将占用大约四分之一的内存。

重写Python算法以使用NumPy需要做一些工作,因为需要使用NumPy的语法重新声明数组对象。但是NumPy在实际的数学操作中使用Python现有的习惯用法(+、-等等),所以切换到NumPy并不会让人太迷惑。

4.使用C

NumPy使用C编写的是一种很好的方法。如果现有的C能够满足你的需求,那么Python及其生态系统将提供几个选项来连接到该库并利用其提高速度。

最常用的方法是Python的ctypes。因为ctypes与其他Python应用程序广泛兼容,所以它是最好的起点,但也并不是唯一的,CFFI项目为C. Cython提供了一个更优雅的接口(参见下面第五点),也可以用来包装外部,代价是你必须学习Cython的标记方法。

5.转换为Cython

如果你非常追求速度,应该用C而不是python,但是对于我这种有python依赖症的人来说,对C天生就有种畏惧。现在有一个很好的解决办法出来了。

Cython允许Python用户方便地访问C的速度。现有的Python代码可以逐步转换为C :首先通过Cython将所述代码编译为C,然后通过添加类型注释以获得更快的速度。

不过,Cython不能变魔术。按原样转换为Cython的代码通常运行速度通常不会加快超过15%到50%,因为该级别的大多数优化都集中在减少Python解释器的开销上。只有在为Cython模块提供类型注释时才允许将相关代码转换为纯C,这时候的速度提升才最大。

6.使用多线程

由于全局解释器锁(GIL)的存在,Python规定一次只执行一个线程,以避免在使用多个线程时出现状态问题。它的存在有充分的理由,但依然很讨厌

随着时间的推移,GIL的效率显著提高(这是为什么你应该用python3的其中一个原因),但是核心问题仍然存在。为了解决这个问题,Python提供了多处理模块(multiprocessing)来在单独的内核上运行Python解释器的多个进程。状态可以通过共享内存或服务器进程共享,数据可以通过队列或管道在进程实例之间传递。

您仍然必须手动管理进程之间的状态。此外,启动多个Python实例并在它们之间传递对象也会涉及不少开销。尽管如此,多处理还是很有用的。另外,使用了C的Python模块和包(如NumPy)也是完全避免GIL的。这也是推荐它们提高速度的另一个原因。

7.知道你的正在干嘛

简单地输入import xyz是多么方便啊!但是你知道,第三方库虽然可以改变应用程序的性能,但并不总是向好的方向发展。

有时,你加了某个模块的时候,应用程序反而变慢了,这就是来自特定的模块构成瓶颈。同样,仔细计算运行时间也会有所帮助,有时则不那么明显。示例:Pyglet是一个用于创建窗口图形化应用程序的,它自动启用调试模式,这将极大地影响性能,直到显式禁用为止。除非阅读文档,否则你可能永远不会意识到这一点。多读书,多了解情况。

8.意识到平台间的速度差异

Python的运行是跨平台的,但这并不意味着每个操作系统(Windows、Linux、OS X)的特性都可以在Python下抽象出来。大多数情况下,你需要了解平台的细节,比如路径命名约定等等。

但在性能方面,理解平台的差异也很重要。例如,有些python脚本需要使用Windows的api去访问一些特定的应用,这些应用也可能会减慢运行速度。

9.使用pypy运行程序

CPython是Python最常用的优化方案,因为它优先考虑兼容性而不是原始速度。对于那些想把速度放在首位的程序员来说,PyPy是一个Python更好的方案,它配备了一个JIT编译器来加速代码的执行(编译为C代码)。

因为PyPy被设计为CPython的一个临时替代品,所以它是获得快速性能提升的最简单方法之一。大多数Python应用程序将完全按原样运行在PyPy上。然而,充分利用PyPy可能需要不断地测试。你将会发现,长时间运行的应用程序更有可能从PyPy中获得了最大的性能收益,因为编译器会随着时间分析执行情况。对于运行和退出的简短脚本,最好使用CPython,因为性能的提高不足以克服JIT的开销

10.升级到python3

如果你用的是python2。而且没有压倒一切的理由(比如一个不兼容的模块)坚持使用它,你应该跳到python3。

Python 3中还有许多Python 2.x中没有的构造和优化。例如,Python 3.5使异步变得不那么棘手,asyncawait关键字成为语言语法的一部分。Python 3.2对全局解释器锁进行了重大升级,显著改进了Python处理多线程的方式。

以上就是全部十点的改进方案啦,尽管使用了这些方法可能运行速度还是无法超过C和Java,但是代码跑得快不快,不取决于语言,而是取决于人,况且Python本身不必是最快的,只要足够快就行。

如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典