You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:27:03