用到的包
import time
import random
import string
import secrets
生成指定长度的随机字母和数字组成的字符串
def generate_random_string(n):
# 定义字符集(字母 + 数字)
characters = string.ascii_letters + string.digits # a-z, A-Z, 0-9
# 从字符集中随机选择n个字符并拼接成字符串
return ''.join(random.choices(characters, k=n))
使用加密的方式保证安全性
def generate_secure_random_string(n: int) -> str:
characters = string.ascii_letters + string.digits
# 使用安全的随机生成器选择字符
return ''.join(secrets.choice(characters) for _ in range(n))
自定义字母、数字,生成的方式更灵活
def generate_clear_random_string(n: int) -> str:
# 排除易混淆字符
safe_letters = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
safe_digits = '23456789'
characters = safe_letters + safe_digits
return ''.join(random.choice(characters) for _ in range(n))
常规for循环生成
def generate_random_letter_and_num(n): # 生成指定长度n的随机字母和数字组成的字符串
ret = ""
for i in range(n):
num = random.randint(0, 9)
# num = chr(random.randint(48,57))#ASCII表示数字
letter = chr(random.randint(97, 122)) # 取小写字母
Letter = chr(random.randint(65, 90)) # 取大写字母
s = str(random.choice([num, letter, Letter]))
ret += s
return ret
方法性能分析
方法名称 | 核心逻辑 | 性能瓶颈 | 时间复杂度 | 实际耗时/s(循环调用1000次,每次生成长度10000的字符串) |
---|---|---|---|---|
generate_random_string | 使用random.choices一次性生成n个字符 | 无循环,底层C优化 | O(n) | 0 |
generate_secure_random_string | 循环调用secrets.choice,用列表推导式拼接 | 加密耗时 | O(n) | 5 |
generate_clear_random_string | 循环调用random.choice,用列表推导式拼接 | 循环调用函数(Python解释器开销) | O(n) | 2 |
generate_random_letter_and_num | n次循环,+ 字符串拼接 | 多次随机数生成 + 低效字符串拼接(O(n²)) | O(n²) | 13 |
关键点分析
-
random.choices VS secrets.choice
方法 random.choices secrets.choice 所属模块 random(通用随机数) secrets(加密安全随机数) 返回值数量 可返回多个元素(通过 k 参数指定) 仅返回一个元素 权重支持 支持概率分布(weights 参数) 不支持权重 安全性 伪随机数,不适用于安全场景 加密安全,适合密码学相关操作 适用场景 游戏、模拟、非敏感数据抽样 生成密码、令牌、密钥等安全敏感操作 -
random.choices VS 循环调用random.choice
random.choices 是批量生成(一次调用返回 n 个字符),底层由C实现,效率远高于Python层循环调用 random.choice。
但是使用循环调用random.choice方式的generate_clear_random_string更加灵活,支持自定义字母和数字。 -
generate_random_letter_and_num
使用 ret += s 拼接字符串,每次操作需复制整个字符串,导致时间复杂度 O(n²),而其他方法用 join 一次性拼接(时间复杂度 O(n))。