Python优化:快速生成无重复合法颜色差三元组,提速图像生成
代码优化方案:提升像素颜色生成速度
核心问题分析
原代码运行缓慢的主要原因有三点:
- 用列表存储已用差值,每次检查
difference not in usedDifferences是线性扫描(O(n)复杂度),随着已用差值增多,检查耗时呈指数级增长; - 随机差值的生成范围过大(-256到256),大部分生成的差值要么超出颜色合法范围,要么已被使用,导致循环尝试次数暴增;
- 使用全局变量增加了代码耦合度,也间接影响执行效率。
具体优化措施
1. 用集合替代列表存储已用差值
列表的成员检查是线性遍历,而集合的成员检查是哈希查找(O(1)复杂度),能大幅降低检查耗时。注意需要将差值从列表转为元组(列表不可哈希,无法存入集合)。
2. 缩小随机差值的生成范围
根据当前像素的颜色值,提前计算每个通道的有效差值范围:
- 对于R通道当前值
c0,有效差值d0需满足-c0 ≤ d0 ≤ 255 - c0 - G、B通道同理
直接在有效范围内生成随机数,避免生成大量无效差值,减少循环次数。
3. 移除全局变量,改用参数传递
将当前颜色、已用差值集合作为函数参数传入,返回新颜色和更新后的集合,提升代码模块化程度,同时避免全局变量的性能损耗。
4. 预计算所有有效差值(可选)
如果需要的差值数量固定(如1024×1024图像的相邻像素对数量),可以预先生成所有符合条件的差值并打乱顺序,之后直接顺序取用,完全避免循环尝试的过程。
优化后代码示例
基础优化版本(适合动态生成场景)
import random def choose_color(current_color, used_differences): c0, c1, c2 = current_color # 计算每个通道的有效差值范围 min_d0, max_d0 = -c0, 255 - c0 min_d1, max_d1 = -c1, 255 - c1 min_d2, max_d2 = -c2, 255 - c2 while True: # 在有效范围内生成差值 d0 = random.randint(min_d0, max_d0) d1 = random.randint(min_d1, max_d1) d2 = random.randint(min_d2, max_d2) diff_tuple = (d0, d1, d2) if diff_tuple not in used_differences: used_differences.add(diff_tuple) new_color = (c0 + d0, c1 + d1, c2 + d2) return new_color # 使用方式 start_color = (128, 128, 128) used_diffs = set() current_color = start_color # 生成像素时调用 current_color = choose_color(current_color, used_diffs)
预计算差值版本(适合固定数量需求场景)
import random def generate_all_valid_differences(start_color): c0, c1, c2 = start_color valid_diffs = [] # 遍历所有有效差值组合 for d0 in range(-c0, 256 - c0): for d1 in range(-c1, 256 - c1): for d2 in range(-c2, 256 - c2): valid_diffs.append((d0, d1, d2)) random.shuffle(valid_diffs) return valid_diffs # 使用方式 start_color = (128, 128, 128) all_valid_diffs = generate_all_valid_differences(start_color) diff_index = 0 current_color = start_color # 生成像素时直接取预生成的差值 if diff_index < len(all_valid_diffs): diff = all_valid_diffs[diff_index] diff_index += 1 current_color = (current_color[0] + diff[0], current_color[1] + diff[1], current_color[2] + diff[2])
内容的提问来源于stack exchange,提问作者Ian Weed
相关产品推荐
相关产品推荐

