Python因其对程序员友好和使用方便而成为广泛接受的语言之一。虽然速度并非Python的强项,但这并不意味着它总是产生低效的结果。在Python中,人们更倾向于“开发速度”而非“执行速度”。Python可能没有C或Java那样的原生性能,但一个经过适当优化的Python应用可以运行得非常快,足以驱动数据分析、自动化工具、管理等多种应用。如果遵循一些标准的编码程序和技巧,可能几乎会忘记最初是在牺牲应用性能以换取开发者的生产力。
需要在UAT或测试环境之外,直接在生产或实时环境中测量代码,以确切找出为什么或在哪里代码运行最慢。这就是剖析发挥作用的地方,可以使用Python内置的“cProfile”模块来检查代码,找出可能拖累整体代码性能的部分。如果需要更高的精度,可以使用其他强大的剖析工具,它们可以给深入的分析,但在许多情况下,一个简单的剖析工具可以大大帮助追踪导致执行瓶颈的函数或代码行。将能够准确地定位并测试,建立基线以确定各种部署场景中的异常模式或执行时间,可能会过早猜测,但这可能不会带来太多成功,因此应该总是使用剖析工具有效地分解代码。
缓存是一种机制,即使对于已经计算过的函数值,也不需要一遍又一遍地重复相同的工作。Python为提供了缓存选项,可以让立即获取之前计算过的函数的结果。这些Python的特殊功能被称为装饰器,可以在代码中使用它们来加速代码。
from functools import lru_cache
@lru_cache(maxsize=100)
输出:(在本地机器上)
5.8000000000002494e-05
令人震惊,不是吗?这是functools库中LRU_Cache的力量。可以为LRU Cache设置自定义值,或者设置为'None'以存储所有内容。这用于存储在规定时间内频繁重复的值。例如,可能是过去24小时内最近检索的项目,或者是接下来24小时内将被多次调用的值。
NumPy以其基于矩阵或基于数组的数学运算而闻名,但这里的秘密成分是它比Python内置的数据结构更有效地存储数值数据。该包有许多传统数学运算的替代品,由于它利用了C库,所以比一般的Python函数快得多。NumPy还为管理非常大的数据结构(如包含一百万项的列表)的内存,NumPy可以优化并节省高达75%的空间,比普通Python列表更高效。NumPy Array是唯一接近Java或C中数组的东西,易于声明和使用,因此它坚持了“开发速度”的最初承诺。