【 在 Eggcai 的大作中提到: 】
: 标 题: 请教优化代码
: 发信站: 水木社区 (Wed Mar 22 13:25:09 2023), 转信
:
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
:
: #双色球所有号码历次中奖查询代码
:
: filename="i:/ssq.txt" #i:/ssq.txt中存储的是双色球历次中奖号码,形式每行如01182630313303,六个红球一个蓝球号码,共1533行
:
: import time
: iend=10 # iend调试用,iend=34时为实际情况,共17721088种可能,调试时iend=10,共1344种可能
:
: start=time.time()
:
:
: with open(filename) as file_object:
: nums = file_object.readlines()
:
:
: for i0 in range(1,17):
: for i1 in range(1,iend-5):
: for i2 in range(i1+1,iend-4):
: for i3 in range(i2+1,iend-3):
: for i4 in range(i3+1,iend-2):
: for i5 in range(i4+1,iend-1):
: for i6 in range(i5+1,iend):
:
: #构建循环框架,i0为蓝球,i1-i6为红球
: #在我的破机子上,循环一遍17721088次,每次只计数加1,用时就到了4.698s
: #然后是对每一个i0-i6,判断在1533期中,总共中了几个一等奖到六等奖,
:
: n=(i1,i2,i3,i4,i5,i6,i0)
上面的代码可以用itertools的combinations写得更短一些
但是要计算所有组合的中奖情况可能就是需要50小时吧
:
: for s in nums:
: ired,iblue=0,0
: s1,s2,s3,s4,s5,s6,s0=int(s[0:2]),int(s[2:4]),int(s[4:6]),int(s[6:8]),int(s[8:10]),int(s[10:12]),int(s[12:14])
:
: for i in range(0,6):
: if(n[i] in (s1,s2,s3,s4,s5,s6)):
: ired=ired+1
:
: if(n[6] ==s0):
: iblue=iblue+1
:
: if((ired,iblue)==(6,1)):
: j1=j1+1
: if((ired,iblue)==(6,0)):
: j2=j2+1
: if((ired,iblue)==(5,1)):
: j3=j3+1
: if((ired,iblue)==(5,0))or((ired,iblue)==(4,1)):
: j4=j4+1
: if((ired,iblue)==(4,0))or((ired,iblue)==(3,1)):
: j5=j5+1
: if((ired,iblue)==(2,1))or((ired,iblue)==(1,1))or((ired,iblue)==(0,1)):
: j6=j6+1
:
: print(n,' ',j1,j2,j3,j4,j5,j6)
:
:
:
: end=time.time()
: print("Running time %s seconds"%(end-start))
:
:
:
: #调试时1344种情况,不写文件只打印屏幕要近15s,全1700万种可能就得17721088/1344*15/3600约等于55小时。。求优化鶸代码
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 171.106.202.*]
--
FROM 61.149.143.*