8个核心编码技巧,可实现更快的python运行速度 小鄂尔多斯

前言

总的来说,人们使用python是因为它方便且易于编程,而不是因为它很快。大量的第三方库和对Python的工业支持的广泛性弥补了它没有Java或C的原始性能。开发速度优先于执行速度。

但在许多情况下,它不必是一个非此即彼的命题。适当地优化,Python应用程序可以以惊人的速度运行——也许不是Java或C快,但对于Web应用程序、数据分析、管理和自动化工具以及其他大多数目的来说都足够快。实际上,您可能会忘记您是在用应用程序性能来换取开发人员的生产力。

优化python性能并不能归结为任何一个因素。相反,它是关于应用所有可用的最佳实践,并选择最适合当前场景的最佳实践。(Dropbox中的人们有一个关于Python优化功能最引人注目的例子。)

在这篇文章中,我将概述许多常见的Python优化。其中一些是只需将一个项目切换到另一个项目(如更改python解释器)即可实现的嵌入式度量,但实现最大回报的项目将需要更详细的工作。

1。Memoize(缓存)重复使用的数据

当你能做到一次并保存结果时,千万不要做一千次工作。如果有一个经常调用的函数返回可预测的结果,那么python为您提供了将结果缓存到内存中的选项。返回相同结果的后续调用几乎会立即返回。

各种各样的例子展示了如何做到这一点;我最喜欢的记忆几乎是最少的。python的一个本机库functools具有@functools.lru缓存装饰器,它缓存最近对函数的n个调用。当正在缓存的值发生变化,但在特定的时间窗口内是相对静态的时,这很方便。一天中最新使用的项目列表就是一个很好的例子。

2。将数学移动到numpy

如果您正在进行基于矩阵或数组的数学运算,并且不希望Python解释器妨碍您的工作,请使用numpy。通过利用C库进行繁重的工作,numpy提供了比本机python更快的数组处理。它还比Python的内置数据结构更有效地存储数字数据。

相对来说,非异类的数学也可以被numpy大大加快。该包为许多常见的python数学操作(如min和max)提供了替换,这些操作的速度比原来的python快很多倍。

numpy的另一个好处是更有效地使用大型对象的内存,比如拥有数百万个项目的列表。一般来说,像numpy中那样的大型对象如果用传统的python来表示,则占用大约四分之一的内存。请注意,它有助于从作业的正确数据结构开始,即优化本身。

重写python算法以使用numpy需要一些工作,因为数组对象需要使用numpy的语法声明。但是numpy在实际的数学运算中使用了python现有的习语(+、-,等等),所以从长远来看,切换到numpy并不会太令人迷惑。

3。使用C库

numpy使用C语言编写的库是一种很好的模拟策略。如果有一个现有的C库可以满足您的需要,那么Python及其生态系统提供了几个选项来连接到该库并利用其速度。

最常见的方法是使用Python的CTypes库。因为ctypes与其他python应用程序(和运行时)广泛兼容,所以它是最佳的开始位置,但它远不是镇上唯一的游戏。cffi项目为c.cython提供了一个更优雅的接口(见下文),也可以用来包装外部库,尽管代价是必须学习cython的标记。

学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴可以私信回复小编“学习” 获取资料,一起学习

4。与多处理并行

传统的python应用程序——那些在cpython中实现的应用程序——一次只执行一个线程,以避免在使用多个线程时出现状态问题。这是臭名昭著的全球口译员锁(gil)。它的存在有充分的理由,这并没有使它变得更加华丽。

随着时间的推移,gil的效率显著提高(运行python 3而不是python 2的另一个原因),但核心问题仍然存在。一个cpython应用程序可以是多线程的,但是cpython不允许这些线程在多个核心上并行运行。

为了解决这个问题,python提供了多处理模块来在不同的核心上运行python解释器的多个实例。状态可以通过共享内存或服务器进程来共享,数据可以通过队列或管道在进程实例之间传递。

您仍然需要在进程之间手动管理状态。另外,在启动多个Python实例并在其中传递对象的过程中,不会有太多的开销。但是对于长期运行的进程来说,多处理库是非常有用的,因为它可以从跨核心的并行性中获益。

另外,使用C库的python模块和包(如numpy)完全避免使用gil。这也是他们被推荐提速的另一个原因。

5。知道你的库在做什么

简单地输入XYZ并利用无数其他程序员的工作是多么方便!但是您需要知道,第三方库可以改变应用程序的性能,而不是总是为了更好。

有时,这以明显的方式表现出来,例如当来自特定库的模块构成瓶颈时。(再次强调,剖析会有所帮助。)有时情况不那么明显。示例:Pyglet是一个用于创建窗口化图形应用程序的简便库,它自动启用调试模式,这会显著影响性能,直到显式禁用它为止。除非您阅读文档,否则您可能永远不会意识到这一点。阅读并被告知。

6。注意平台

python运行跨平台,但这并不意味着每个操作系统(windows、linux、os x)的特性都是在python下抽象出来的。大多数时候,这意味着要了解平台的具体情况,比如路径命名约定,对于这些约定,有助手函数。

但在性能方面,了解平台差异也很重要。例如,在Windows上,需要计时器精度小于15毫秒(例如,对于多媒体)的python脚本将需要使用Windows API调用来访问高分辨率计时器或提高计时器分辨率。

7。与PyPy同行

cpython是Python最常用的实现,它将兼容性优先于原始速度。对于那些想把速度放在首位的程序员来说,有pypy,一个配备了jit编译器的python实现来加速代码执行。

因为pypy是作为cpython的替代品而设计的,所以它是快速提高性能的最简单方法之一。许多常见的python应用程序将在pypy上运行。一般来说,应用程序越依赖于“普通”的python,就越有可能在pypy上运行而不进行修改。

然而,充分利用PYPY可能需要测试和研究。您会发现长时间运行的应用程序从Pypy获得最大的性能收益,因为编译器会分析一段时间后的执行情况。对于运行和退出的短脚本,您最好使用cpython,因为性能提升不足以克服JIT的开销。

请注意,pypy对python 3的支持仍然落后于几个版本;它目前支持python 3.2.5。使用最新的python特性(如async和await-co例程)的代码将无法工作。最后,使用ctypes的python应用程序的行为可能并不总是如预期的那样。如果您正在编写可能同时在pypy和cpython上运行的东西,那么为每个解释器分别处理用例可能是有意义的。

其他通过抖动加速python的实验仍在取得成果。其中包括一个微软项目pyjion,它为cpython提供了一个JIT接口。微软提供了自己的JIT作为概念证明。

8。升级至python 3

如果您使用的是python 2.x,并且没有覆盖的原因(比如不兼容的模块)来坚持使用它,那么您应该跳到python 3。

除了python 3作为语言的未来,python 3中还提供了许多构造和优化,而python 2.x中没有这些构造和优化。例如,python 3.5通过将async和wait关键字作为语言语法的一部分来减少异步编程的麻烦。python 3.2对全局解释器锁进行了重大升级,显著改进了python处理多个线程的方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容