求解, python3,当数据大的时候,怎么列出全部排序可能?

发布于 2021-05-07 16:28:40

有 999 个数,[000,001,002,...,999]
每 2 个组合成一对,

('000', '001')
('000', '002')
('000', '003')
('001', '002')
('001', '003')
('002', '003')
.............
当 2 个一组时,有 498501 种组合,显示打印出来耗费:3.6621711 秒
当 3 个一组时,有 165668499 种组合,显示打印出来耗费:20.6741886 秒
.............

请问当 400 个一组时,有多少种组合?怎么在 10 秒完成?

我需要对每组数据进行统计编号,

1:('000', '001')
2:('000', '002')
3:('000', '003')
这岂不是非常占用内存空间?有什么更快速,更优雅的写法吗

import itertools
import time


z=[]
for i in range(0,999):
    if i<10:
        i = '00'+str(i)
    elif 10<=i and i<100:
        i ='0'+str(i)
    else:
        i=str(i)
    z.append(str(i))
# 计时开始
start = time.perf_counter()


# 排序全部组合
z2 =(itertools.combinations((z), 3))
end = time.perf_counter()
print('排序组合耗费:',end-start)

c=0
for i in z2:
    c+=1
print('组合数:',c)

# 计时结束
end = time.perf_counter()
print('一共耗费:',end-start)

查看更多

关注者
0
被浏览
138
no1xsyzy
no1xsyzy 2021-05-07

C(1000, 400) > 4e290
10 秒内打印,也就是说每秒打印 >4e289 种可能性。
要区分这 >4e290 种可能性,需要 > log_2 4e290 > 962 bit > 120 bytes
也就是说每秒需要传输 > 4e289*120 B > 4e291 B 的数据

作为比较:yes | pv > /dev/null
采用目前输出速率最高的 GNU yes,2.92GiB/s 即每秒输出 3.135e9 B
中间差了 282 个数量级。

——

@necomancer 让咱们再假定你流式进行处理,每个操作只需要占用一个 CPU 周期,并且你的 CPU 有 64 核,且所有核心超频到 10GHz
4e290 / 64 / 10e9 > 6e278 秒 > 1e271 年
好吧,再让我们用上 GPU 加速每个操作可以用一个 CUDA 核心的一个时钟周期完成,一块 RTX 3090 按照 10496 CUDA 核心,假设超频到 3GHz,需要花费
4e290 / 10496 / 3e9 > 1e277 秒 > 3e269 年
这个数据量太离谱,itertools 也根本没得作用。

——

如果要把 C(1000, 400) 量级的数据在 10 秒内输出,不要说比特币 51% 攻击了,99% 攻击都能发动了。
直接把链算到底,连计算难度都来不及变更,变更了也没用;这 CPU 比当今所有的 GPU 都快几百个数量级。
比特币暴跌,然后我能买到显卡了。

再脑洞下

处理大量信息时,根据 Landauer's principle,必然产生热量,随便地瞎估一下,应远大于
2.805zJ*4e290 相当于 2.682×10^260 吨 TNT 当量
你这不是 CPU,这是 1e250 吨的质量弹

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览