Citat:
Konstigt, så här ser output ut på min MacBook som bara har 8GB RAM (jag lade till en tidsmätning också och ändrade varje block till 1 miiljoner rader istället för 100 000):
Kod:
Uppdaterade koden (endast tidsmätning tillagd):Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3 Önskad summa (t.ex. 200.0) ? 200 Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01 Tryck 1 för text-fil och 2 för CSV-fil: 1 Fullträff omgång 50: Length of chunks: 13061 1 million iterations, 121 rows found 2 million iterations, 248 rows found 3 million iterations, 532 rows found 4 million iterations, 788 rows found 5 million iterations, 1195 rows found 6 million iterations, 1508 rows found 7 million iterations, 1711 rows found 8 million iterations, 1972 rows found 9 million iterations, 2080 rows found 10 million iterations, 2268 rows found 11 million iterations, 2512 rows found 12 million iterations, 2811 rows found 13 million iterations, 3265 rows found 14 million iterations, 3705 rows found 15 million iterations, 4111 rows found 16 million iterations, 4484 rows found 17 million iterations, 4849 rows found 18 million iterations, 5192 rows found 19 million iterations, 5447 rows found 20 million iterations, 5791 rows found 21 million iterations, 6120 rows found 22 million iterations, 6507 rows found 23 million iterations, 6945 rows found 24 million iterations, 7425 rows found 25 million iterations, 7800 rows found 26 million iterations, 8239 rows found 27 million iterations, 8585 rows found 28 million iterations, 9043 rows found 29 million iterations, 9371 rows found 30 million iterations, 9728 rows found 31 million iterations, 10014 rows found Time taken: 17.73 seconds Avg. time: 0.5719 sec/million iterations tips.txt skapad med 10000 rader!
Kod:
import requests
import re
import json
import itertools
import time
from concurrent.futures import ProcessPoolExecutor
def process_chunk(start, end, rowlist, pmin, pmax):
sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
valid_combinations = []
tss = 0
for comb in sub_gen:
tss += 1
indices, values = zip(*comb)
s = sum(values)
if pmin <= s <= pmax:
valid_combinations.append(indices + (s,))
return valid_combinations, tss
def main():
gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))
if not gamemode in [1,2,3]:
print("Endast 1-2 möjliga val. Avbryter.")
quit()
pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
pmin = pgoal - pdev
pmax = pgoal + pdev
mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))
if not mde in [1,2]:
print("Endast 1 eller 2 möjliga val. Avbryter.")
quit()
urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
url = urls[gamemode]
outfiles = ["", "tips.txt", "tips.csv"]
outfile = outfiles[mde]
try:
response = requests.get(url)
html_content = response.text
except:
print(f"Kan inte komma hämta data från: {url}. Avbryter.")
quit()
pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
try:
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))
except:
print(f"Kunde inte extrahera data")
quit()
signlists = []
rowlist = []
if gamemode == 3: # om fullträff, sätt upp lista utifrån 13 rader
draws=json_obj["Draws"]["entities"]
try:
drawsKey = list(dict.keys(draws))[0]
except IndexError:
print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
quit()
omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
print(f"Fullträff omgång {omg}:")
else: # annars sätt upp lista utifrån 3 tecken
for _ in range(0,3):
signlists.append([])
for gameKey in gameKeys: # iterera över alla 13 matcher
numAlts=3
if gamemode==3: # Fullträff
numAlts=6
game = gameDict[gameKey]["odds"]["current"]["value"] # hämtar odds-värden från Fullträff-sidan
gamesum = 0.0
floats = []
fgame = []
for i in range(0,numAlts):
if game[i] == None:
print ("None-error",gameDict[gameKey])
quit()
f = 100.0/float(game[i]) # konvertera oddset 100/o
floats.append(f)
gamesum = sum(floats)
for ix,o in enumerate(floats):
newo = 100.0 * o / gamesum # normalfördela fullträff-oddsen så att summan blir 100.0
if ix<numAlts:
fgame.append(newo)
if gamemode==3:
rowlist.append(fgame)
else:
for ix,perc in enumerate(fgame):
signlists[ix].append(perc)
if gamemode<3:
P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] }
rows = itertools.product(*(['1X2'] * 13))
cn = 0
with open(outfile, 'w') as f:
for row in rows:
percentage = sum(P[result][n] for (n, result) in enumerate(row))
if pmin <= percentage <= pmax:
cn += 1
if mde==1:
f.write("E,"+','.join(row)+"\n")
if mde==2:
f.write(','.join(row + (str(percentage),))+"\n")
else:
maxcoupons = 10000
cn = 0
tsts = 0
valid_combinations = []
chunk_size = 1000000 # You can adjust the chunk size
total_size = 6 ** 13 # 6^13 combinations
chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
print ("Length of chunks:",len(chunks))
start_time = time.time()
with ProcessPoolExecutor() as executor:
for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
tsts += chunk_tsts
valid_combinations.extend(chunk_result)
cn += len(chunk_result)
if tsts % 1000000 == 0:
print(int(tsts / 1000000), "million iterations,", cn, "rows found")
if cn >= maxcoupons:
break
end_time = time.time()
taken_time = round(end_time - start_time,2)
ave_time = round(taken_time/(tsts/1000000),4)
print(f"Time taken: {taken_time} seconds")
print(f"Avg. time: {ave_time} sec/million iterations")
with open(outfile, 'w') as f:
f.write(f"Fulltraff,Omg={omg}\n") # första raden
for ix,comb in enumerate(valid_combinations):
if mde == 1 and ix<maxcoupons: # TXT-läge
comb=list(comb)
comb.pop() # ta bort summa som inte används i TXT-läge
f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
elif mde == 2 and ix<maxcoupons: # CSV-läge
f.write(','.join(str(nm) for nm in comb)+"\n")
cn=min(cn,maxcoupons)
print(f"{outfile} skapad med {cn} rader!")
if __name__ == '__main__':
main()
__________________
Senast redigerad av Enterprise 2023-09-09 kl. 10:35.
Senast redigerad av Enterprise 2023-09-09 kl. 10:35.