用Python写的程序确实会比其他语言的性能差。这是因为Python为了最大化开发效率牺牲了一定的运行效率。开发效率和运行效率往往是不相容的关系。但是,程序性能不佳的原因是多方面的,不能全怪Python。我们应该先从自己的代码中找原因。找到原因最快的方法是计算我们编写的语句或函数的执行时间。这时候很多人会选择用下面的形式打印出语句的执行时间:importtimea=time.time()temp=[index*indexforindexinrange(1000000)]b=time.time()print(b-a)这是一种相对低效的方法。如果你有几万条语句要测试,用这种方法找瓶颈简直就是大海捞针。幸运的是,得益于Python强大的社区功能,我们有很多关于效率的模块可以使用。今天我们要介绍的是line_profiler,它可以计算函数中每条语句所花费的时间。我们将使用上一篇电影人脸识别的代码来解释:Python识别电影中的人脸,但请注意,本文中的函数传递的参数少了几个。正确参数请点击帖子下方按钮阅读原文查看。1.当然要准备Python环境了。如果你还没有安装过Python,可以看这篇文章:超级详细的Python安装指南。打开cmd/terminal,输入以下命令安装line_profile:pipinstallline_profilerwindowsmachine如果出现需要MicrosoftVisualC++14.0等错误,请到微软官网下载vs2015,勾选“PublicToolsforVisualC++2015”安装。如果出现:ModuleNotFoundError:Nomodulenamed'skbuild',请输入以下命令安装scikit-build:pipinstallscikit-build如果还是没有安装,可以下载anaconda,输入以下命令安装:condainstall-canacondaline_profiler2。使用方法很简单。比如读取人脸的代码中,main函数如下:'.JPG','png','PNG')我们要测量的是read_pic_save_face函数中所有语句的执行时间,只需要这样调用line_profiler:if__name__=='__main__':sourcePath='frames/test'targetPath1='target/test'#read_pic_save_face(sourcePath,targetPath1,'.jpg')profile=LineProfiler(read_pic_save_face)profile.runcall(read_pic_save_face,sourcePath,targetPath1,'.jpg')profile.print_stats()这样执行可以获得函数所有语句的时间报告。当然,它还有很多其他的调用方式。详情请参考line_profiler文档:https://github.com/rkern/line_profiler3。阅读报告line_profiler报告包括几个部分:**Line:该语句位于哪一行Hits:该行被执行的次数Time:该语句运行的总时间PerHit:该语句平均花费的时间百分比statementrunningonceTime:statement占总时间的比例**可以看到,我们的代码主要在face_cascade.detectMultiScale耗时最长,这是opencv的classifier的执行效率。知道这里是效率问题,优化就有目标了。对于这部分的优化,我们可以从硬件入手,让OpenCV在GPU上运行算法。这样的性能会远远超过在CPU上运行的性能。这是一个技巧。第二种是使用多线程计算(没试过,不确定有没有用,下次可以试试)。这是我们文章的结尾。如果你今天想要我们的Python教程,请继续关注我们。如果对您有帮助,请在下方点赞或观看。如果您有任何问题,可以在下方留言区留言。我们会耐心解答!Python实用书(pythondict.com)不只是一本书欢迎阅读公众号:Python实用书原文来自Python实用书:Python优化——计算每条语句的执行时间
