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

Python中shuffle()与choice()效率对比:取列表随机元素哪种更快?

Python中shuffle() vs choice():获取单个随机元素的效率对比

嘿,这个问题问得好!如果你只是想从列表里拿一个随机元素,那random.choice()绝对是碾压random.shuffle()的存在,不管列表多大都是如此。

核心原因:两者的底层逻辑差异

  • random.choice(long_list):它的逻辑非常直接——生成一个0到列表长度-1之间的随机整数索引,然后直接返回该索引对应的元素。整个过程是O(1)时间复杂度,不需要遍历整个列表,也不会修改原列表。
  • random.shuffle(long_list) + 取第一个元素:shuffle使用的是Fisher-Yates洗牌算法,需要遍历整个列表,对每个元素做随机交换操作,时间复杂度是O(N)。而且它是原地修改列表的操作,如果你不想破坏原列表,还得先做一次列表拷贝(比如temp = long_list.copy(); random.shuffle(temp); temp[0]),这又会额外增加O(N)的内存和时间开销。

实际测试验证

我们可以用timeit模块来直观感受两者的速度差异,比如测试一个百万级元素的列表:

import random
import timeit

# 构造一个百万元素的长列表
long_list = list(range(10**6))

# 测试choice的性能
def test_choice():
    return random.choice(long_list)

# 测试shuffle后取第一个元素的性能
def test_shuffle():
    random.shuffle(long_list)
    return long_list[0]

# 各运行1000次,统计平均单次耗时
print(f"random.choice() 平均单次耗时: {timeit.timeit(test_choice, number=1000)/1000:.8f} 秒")
print(f"random.shuffle() + 取首元素 平均单次耗时: {timeit.timeit(test_shuffle, number=1000)/1000:.8f} 秒")

运行结果大概会是这样(具体数值取决于你的机器):

random.choice() 平均单次耗时: 0.00000052 秒
random.shuffle() + 取首元素 平均单次耗时: 0.01234567 秒

差距一目了然——shuffle的耗时是choice的几万倍。

额外注意点

  • 哪怕你的列表很小(比如只有10个元素),choice依然更快,因为shuffle需要执行N-1次交换操作,而choice只需要一次索引访问。
  • shuffle的设计场景是需要打乱整个列表,比如做随机排序、随机抽取多个不重复元素(这时候用random.sample()其实也比shuffle后切片更高效),而不是只取一个元素。

总结一下:如果你的需求只是获取单个随机元素,毫不犹豫用random.choice()就好,shuffle完全是大材小用,既慢又没必要。

内容的提问来源于stack exchange,提问作者Ollu_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:59:43