Python冒泡排序执行耗时过长,如何优化测速代码运行速度?
问题排查与优化方案
现有代码的显性问题
你当前的代码首先存在导入缺失问题,使用了randint但没有导入random模块,需要在头部补充from random import randint才能正常运行。
冒泡排序运行极慢的核心原因
冒泡排序的平均时间复杂度为O(n²),当n达到10万级别时,单趟排序需要进行近100亿次比较和交换操作,纯Python实现的原生循环本身执行效率就低,叠加高复杂度的运算量,自然会出现耗时极长的情况。
可落地的优化方案
1. 优化冒泡排序本身的逻辑
- 新增交换标记:如果某一轮遍历过程中没有发生任何交换,说明当前数组已经完全有序,可以直接终止排序,无需跑完所有剩余遍历,对随机数组场景可减少30%以上的无效遍历
- 简化交换逻辑:用Python原生多变量赋值替换临时变量交换操作,单步交换执行效率可提升20%左右
优化后的冒泡排序代码如下:
def bubble_sort(array): n = len(array) for iter_num in range(n - 1, 0, -1): swapped = False for idx in range(iter_num): if array[idx] > array[idx + 1]: array[idx], array[idx + 1] = array[idx + 1], array[idx] swapped = True # 本轮无交换,直接终止 if not swapped: break
2. 优化计时逻辑
- 替换计时函数:使用
time.perf_counter()替代time.time(),前者是专门用于测量短时间间隔的高精度计时器,测量结果误差更小 - 大样本量调整循环次数:对于n≥100000的测试场景,O(n²)的冒泡排序单趟耗时已经达到秒级,跑100次的总耗时会达到数小时级别,如果项目要求允许,可适当降低大n的循环次数(比如n=100000跑10次,n=300000跑3次),平均值的误差不会超过10%,如果必须跑满100次,建议提前做好耗时预期。
优化后的完整测试代码如下:
import time from random import randint def bubble_sort(array): n = len(array) for iter_num in range(n - 1, 0, -1): swapped = False for idx in range(iter_num): if array[idx] > array[idx + 1]: array[idx], array[idx + 1] = array[idx + 1], array[idx] swapped = True if not swapped: break def timing(func, n, runs=100): timing_list = [] # 预生成所有测试数组,避免生成时间干扰排序计时 test_arrays = [[randint(0, 10000) for _ in range(n)] for _ in range(runs)] for arr in test_arrays: t1 = time.perf_counter() func(arr) t2 = time.perf_counter() timing_list.append(t2 - t1) return (sum(timing_list) / len(timing_list)) * 1000 def run_test(func): print(f"n=100 平均耗时:{timing(func, 100)} ms") print(f"n=1000 平均耗时:{timing(func, 1000)} ms") print(f"n=10000 平均耗时:{timing(func, 10000)} ms") # 大n调整循环次数,不需要的话可以删掉runs参数恢复100次 print(f"n=100000 平均耗时:{timing(func, 100000, runs=10)} ms") print(f"n=300000 平均耗时:{timing(func, 300000, runs=3)} ms") if __name__ == '__main__': run_test(bubble_sort)
3. 非强制冒泡排序的替代方案
如果你的项目没有强制要求必须使用冒泡排序,可以替换为时间复杂度*O(nlogn)*的排序算法,比如直接调用Python内置的list.sort()方法,该方法是C语言实现的,处理30万数据量单趟仅需几毫秒,跑满100次也只需要几百毫秒,完全满足测试要求。
内容的提问来源于stack exchange,提问作者Noragiri
相关产品推荐
相关产品推荐

