python组成三位无重复数字_Python生成十万个无序且唯一的数字
數(shù)字無處不在, 在一些應(yīng)用場景就特別需要, 比如 訂單號 / 防偽碼 / 抽獎 / 用戶編號 等.
訂單號一般都是即時生成的, 比如很多都是用下單時間或者時間戳 如:2020043018010005 或者 1588240860000 還能再加上用戶 ID 和隨機數(shù), 所以就沒什么難度.
但是有些應(yīng)用場景就不一樣了, 比如防偽碼和用戶編號, 防偽碼可能有十萬個或者更多, 就需要一次性批量的生成了, 并且還要保證唯一性, 另外因為防偽碼的特殊性還需要保證無序. 如果用戶編號想做到無序也是一樣, 需要先批量生成存儲到某個容器, 然后依次拿出使用.
查閱了一些資料, 想了解一下怎么樣才能又快又能保證唯一性和無序的大量生成數(shù)字, 看到了 "雪花算法", 但是感覺有點難. 勸退了...
博主有簡單學(xué)一下 Python , 所以就拿 Python 寫一下(獻丑了)import random
lst_number = []
lst_selected_number = []
start_number = 1000000 # 開始數(shù)字
end_number = 9999999 # 結(jié)束數(shù)字
num = 100000 # 生成數(shù)量
if end_number <= start_number:
print('結(jié)束數(shù)字不能小于開始數(shù)字')
exit()
for x in range(start_number, end_number):
lst_number.append(x)
lst_selected_number = random.sample(lst_number, num)
print(lst_selected_number)
將上面代碼復(fù)制保存到 number.py 并運行. 會打印出一個裝滿了十萬個數(shù)字的列表:
這樣一下子就生成出來了十萬個無序且唯一的數(shù)字.
邏輯很簡單, 就是先設(shè)置一個空列表, 然后循環(huán)遍歷開始數(shù)字到結(jié)束數(shù)字, 比如從 1000000 開始, 到 9999999 結(jié)束, 將每個遍歷出來的數(shù)字裝入列表, 那么這個列表的元素就有 1000001, 1000002 1000003 ... 直到 9999998. 遍歷完成后列表就一共有九百萬個數(shù)字, 使用 random.sample 函數(shù)就能直接從列表的九百萬個數(shù)字中抽取十萬個數(shù)字出來, 且是不重復(fù)的抽. 所以就拿到了十萬個唯一且無序的數(shù)字.
拿到數(shù)字之后可以保存到一些容器按需使用, 但是仔細(xì)看上圖, 每個數(shù)字的長度都是七位. 假如防偽碼需要的是十一位呢, 可以修改代碼的開始數(shù)字為 10000000000 到 99999999999 然后運行代碼會發(fā)現(xiàn), 沒反應(yīng)了... 再打開系統(tǒng)任務(wù)管理器, 發(fā)現(xiàn) Python 占用的內(nèi)存極高.
再過沒多久, 就直接報錯了.
內(nèi)存不夠了...
盲猜是因為遍歷存入列表, 列表數(shù)據(jù)太多把內(nèi)存撐爆了, 所以使用 Redis 的列表進行存儲:import random
import redis
pool = redis.ConnectionPool(host = 'localhost', port = 6379, decode_responses = true)
container_box = redis.Redis(connection_pool = pool) # 連接池
start_number = 10000000000 # 開始數(shù)字
end_number = 99999999999 # 結(jié)束數(shù)字
if end_number <= start_number:
print('結(jié)束數(shù)字不能小于開始數(shù)字')
exit()
for x in range(start_number, end_number):
container_box.lpush("list1", x)
print(container_box.llen("list1"))
執(zhí)行代碼, Redis 會開始存儲數(shù)字, 使用可視化工具看得很直觀
但是問題來了, 按照之前代碼(本文第一段代碼)生成九百萬個數(shù)字的效率, 時間應(yīng)該是兩秒, 第二段代碼生成十一位的數(shù)字就是九百億個, 假設(shè)一秒能完成九百萬個數(shù)字, 那也要 10000 秒, 就是最快也要 3 個小時... 但實際肯定是不止的.
博主用了大概兩個半小時才生成了七千萬個數(shù)字就放棄了...
如果已經(jīng)完成數(shù)字遍歷并將數(shù)字存入了 Redis, 接下來要做的就是按需使用, 需要使用數(shù)字的時候, 從 0 到 90000000000 (九百億) 取一個隨機數(shù)字, 拿列表中這個隨機數(shù)字(Key)的元素, 拿取之后記得刪除該元素.
經(jīng)過博主的測試, 生成十萬個長度八位(10000000 - 99999999 之間)的數(shù)字(無序且唯一)需要用時 17 秒(不使用 Redis)左右.
九位及以上就爆內(nèi)存了.. 運行代碼的機器是 16G 的. 如果電腦有 32G 或許可以挑戰(zhàn)一下11位.
總結(jié)
以上是生活随笔為你收集整理的python组成三位无重复数字_Python生成十万个无序且唯一的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表的嵌套_Python中关
- 下一篇: 利用dos管道命令获取屏幕内容_汇编语言