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)
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小时。。求优化鶸代码
--
FROM 171.106.202.*