编程学习网 > 编程语言 > Python > 求你不要再用这几个 Python 编码了,太慢了...
2024
04-09

求你不要再用这几个 Python 编码了,太慢了...


Python 脚本的运行速度一直都是开发者诟病的地方,无论是网站运行迟缓,还是数据分析工作长达数小时,代码运行缓慢将影响所有相关人员,使其效率大打折扣,甚至可能危及项目的成功。

在本文中,我将介绍一些的最常见的拖垮性能的一些编程代码,并推荐相应的解决方法,为你的 Python 涡轮增压!当然,如果你不限于此,推荐你看下前面推荐 mojo 语言 比 Python 快几万倍:比Python快9万倍!AI编程语言Mojo正式开源。

01 循环
我们通常对for循环情有独钟,在需要进行大量作业时,首先想到的就是使用 for 循环。而在优化速度时,尤其是在讨论大型数据集时,这些循环简直就是噩梦般存在。

数字加法:将一大串数字的平方相加,首先使用一个循环方法:

numbers = [1, 2, 3, 4, 5, ... , 10000]  # A big list
total = 0
for number in numbers:
    squared = number * number
    total += squared
在引擎下,Python 会对每个元素进行大量的单独计算。

解决方法:NumPy
这时,NumPy 就像超级英雄一样,它的矢量化简直无敌!一次性对整个数组执行操作。

import numpy as np

numbers = np.array([1, 2, 3, 4, 5, ... , 10000])  
squared = numbers * numbers  # Vectorized squaring!
total = squared.sum()
NumPy 不需要逐个元素计算,而是一气呵成地处理整个计算过程。

折中方案
列表推导式:

total = sum(number * number for number in numbers)
它们通常比传统循环更快,但在进行高强度数值计算时,可能无法与 NumPy 匹敌。

02 错用工具
对于 Python 来说,仅仅依靠列表来完成所有任务无异于只用一只手编程。

查询电话号码:假设有一个这样的联系人列表:

contacts = [
    {"name": "Alice", "phone": "123-4567"},
    {"name": "云朵君", "phone": "789-0123"},
    # ... more contacts
]
查找云朵君的号码意味着要扫描列表,可能要检查每一个联系人。

解决方法:具有超能力的数据结构
字典:快速查找的好帮手
如果要通过关键字(如 "姓名")进行搜索,字典就是你的救星。

contacts_dict = {
    "Alice": "123-4567",
    "云朵君": "789-0123",
    # ... more contacts
}
bobs_number = contacts_dict["云朵君"]  # Instant access!
集合: 强制执行唯一性
需要跟踪唯一的网站访问者吗?集合会自动删除重复项。

unique_visitors = set()
unique_visitors.add("192.168.1.100")
unique_visitors.add("124.58.23.5")
unique_visitors.add("192.168.1.100")  # No duplicate added
Python 还提供了更多超级有用的工具:有序字典、特殊队列 deques 等。了解何时使用这些工具标志着优秀与卓越脚本之间的区别。

03 在黑盒中优化
你一定对这种感觉很熟悉,虽然发现了代码运行缓慢,但却对原因一无所知时。这就好比在没有灯光的情况下修灯泡。

假设你有一个计算斐波那契数字的函数。你费尽心力来完善数学推理,但速度仍然很慢。结果发现,瓶颈可能是某些看不见的东西,比如在边运行代码边将结果记录到磁盘文件中。

解决方法:cProfile 来救场!
Python 内置的cProfile模块就是你的性能侦探。下面介绍如何使用它:

import cProfile

def my_function():
    # Your code to be profiled

cProfile.run('my_function()')
这将生成大量统计数据。主要内容如下

ncalls: 函数被调用的次数。
tottime: 在函数中花费的总时间。
cumtime: 与 tottime 类似,但包括调用其中所有函数所花费的时间。
筛选线索这些数字将指出真正的瓶颈,帮助你将优化工作集中在影响最大的地方。

04:重复造轮子
重新造轮子就像决定徒步穿越整个国家,而不是乘坐飞机前往目的地。就像上一步介绍的python工具一样,其实Python 真的有很多神奇的内置函数来帮助你完成你的工作。要不然python怎么会被戏称胶水语言呢。

排序:可以编写自己的冒泡排序实现......或者使用 Python 的sorted():

my_list = [5, 3, 1, 4, 2]

# The long way (probably pretty slow)
def my_bubble_sort(list): 
   # ... your sorting code here

# The Pythonic way
sorted_list = sorted(my_list)
很有可能,你的自定义排序算法甚至无法达到内置算法的效率。当然,如果你是编程超级高手,不用在意这些

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取