- 主题:请教优化代码
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.*
【 在 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.*
如果提供ssq.txt的话,可以试一试
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 121.33.161.*
【 在 iMx 的大作中提到: 】
: 如果提供ssq.txt的话,可以试一试
--
FROM 171.106.202.*
附件(24KB) ssq.txts1,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])
这个字符串转数字应该提到循环外,能省一半时间
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 219.136.128.*
觉得太慢了就先查一下慢在什么地方了
py自己有不少可以profile的工具
很多时候查一下就能快一到两个量级
另外
直觉你这个结果是很稀疏的那种吧
直接循环已经有的15xx行可能会比较快
本来python的循环就是很慢
要是用起来很暴力就不如上向量化的操作了
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 222.131.26.*
用pandas吧,
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,
: 33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多
: 少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 120.229.14.*
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 223.101.88.*
这个c++跑要多久?
【 在 Eggcai 的大作中提到: 】
: 20年前用的是C++,现在学习python,写一个程序,算双色球中奖的。列举所有C(6,33)*16=17721088种可能的号码,从有据可查到现在的1500多期开奖,每个号码能够中多少个一等奖,多少个二等奖到六等奖。
: 程序写出来了,但是运行时间不能接受,求优化代码
: #双色球所有号码历次中奖查询代码
: ...................
--
FROM 36.110.28.*
还没用C++写。。。也十多年没用了,要写还得查资料。。
【 在 fupip 的大作中提到: 】
: 这个c++跑要多久?
--
FROM 171.106.202.*