为什么对原始数据进行排序或打乱顺序会显着增加全遍历的性能时间?

聖光之護
发布: 2025-03-19 10:00:23
原创
603人浏览过

为什么对原始数据进行排序或打乱顺序会显着增加全遍历的性能时间?

数据排序对全遍历性能的意外影响

在构建测试数据生成器时,我观察到一个有趣的现象:对原始数据排序后,数据生成时间显著增加。这与预期的O(n)时间复杂度相悖。

以下是我的测试代码片段:

import random
import json
import tqdm
import sys
import humanize

num = 100000
test_data_num = 0

test_strings = []
print('生成随机字符串...')
for i in tqdm.tqdm(range(num * 10)):
    test_strings.append(''.join(
        [random.choice('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz')
         for _ in range(random.randint(3, 10))]))
# 关键行:修改此处观察性能变化
test_strings = tuple(test_strings)  # 原代码
# test_strings = tuple(sorted(test_strings)) # 排序
# random.shuffle(test_strings) # 打乱顺序
# test_strings = random.sample(test_strings, len(test_strings)) # 随机采样

print('随机字符串生成完毕,大小为:',
      humanize.naturalsize(sys.getsizeof(test_strings)))
data: list = []
print('开始生成测试数据...')
for i in tqdm.tqdm(range(num)):
    test_data_str = ''.join(
        [random.choice('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz')
         for _ in range(random.randint(3, 8))])
    data.append((test_data_str, {j for j in test_strings if j.startswith(test_data_str)}))
print('测试数据生成完毕,大小为:',
      humanize.naturalsize(sys.getsizeof(data)))
json.dump({'num': num, 'test_strings': test_strings, 'data': data}, open(f'test_data_{test_data_num}.json', 'w'))
登录后复制

将 test_strings = tuple(test_strings) 替换为排序或打乱顺序操作(如 tuple(sorted(test_strings))、random.shuffle(test_strings) 或 random.sample),生成时间从2.5小时飙升至5.5小时。即使简单地将 tuple 替换为 list 也会导致时间增加。

性能分析与推测

  1. 排序并非罪魁祸首: 实验表明,问题并非排序本身,而是破坏了原始数据的内存地址连续性。排序、打乱或随机采样都会导致性能下降。

  2. 迭代操作无关: 即使将迭代内部操作简化为 pass,性能差异依然显著。

  3. 内存寻址效率: 我推测性能瓶颈在于内存访问效率。初始状态下,test_strings 中的字符串地址相对连续,有利于 CPU 缓存命中。排序或打乱后,地址变得离散,导致缓存失效率上升,频繁访问主内存,从而拖慢速度。 这可能也涉及到分页机制,顺序访问更少地触发页面置换。

为了验证缓存命中率的影响,可以尝试将 test_strings 反转:

test_strings = list(reversed(test_strings))
登录后复制

观察反转操作是否也会影响性能。 这些实验结果表明,数据在内存中的布局对全遍历性能有显著影响,这与CPU缓存和内存分页机制密切相关。

以上就是为什么对原始数据进行排序或打乱顺序会显着增加全遍历的性能时间?的详细内容,更多请关注php中文网其它相关文章!

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号