Цель состоит в том, чтобы создать псевдослучайный список из 100 пар целых чисел, а затем найти GCD из них, используя метод грубой силы, и две версии алгоритма Евклида, синхронизируя каждую из них и вычисляя статистику из указанных времен, экспортируясказал данные в Excel.Это для класса, но назначение уже было включено, в версии C ++, но я хотел сделать представление Python и сделать его легко расширяемым для будущих программных заданий (все они будут различными таймингами алгоритмов и экспортированы в Excel).
Для этого вот моя текущая попытка:
#Imports
import random
import xlwt #Must be installed via pip to run without full compile.
import timeit
import sys
import statistics #Must be installed via pip to run without full compile.
#------------------
#Defines/Global
randomNumbers = []
times = []
#------------------
#-------------Excel Workbook Set-up--------------------
wb = xlwt.Workbook()
wb2 = xlwt.Workbook()
wb3 = xlwt.Workbook()
wb4 = xlwt.Workbook()
wb5 = xlwt.Workbook()
wb6 = xlwt.Workbook()
sheet1 = wb.add_sheet('sheet 1')
sheet2 = wb2.add_sheet('sheet 2')
sheet3 = wb3.add_sheet('sheet 3')
sheet4 = wb4.add_sheet('sheet 4')
sheet5 = wb5.add_sheet('sheet 5')
sheet6 = wb6.add_sheet('sheet 6')
#----------------------------------------------------
#Random Number Pairs Generator
def randomNumberPairs():
randPairs = []
for _ in range(100):
x = random.randint(1, 998)
n = random.randint(x, 999)
randPairs.append(x)
randPairs.append(n)
return randPairs
#Brute Force
def bf(a,b):
startTime = timeit.default_timer()
for i in range(1, b + 1):
if a % i == 0 and b % i == 0:
gcd = i
times.append(timeit.default_timer() - startTime)
return gcd
#--------------------------------------------
#"Original" Euclid
def euclid1(x,y):
r = None
startTime = timeit.default_timer()
while 0 != r:
#q = x%y
r = x%y
x = y
y = r
times.append(timeit.default_timer() - startTime)
return x
#--------------------------------------------
#"Enhanced" Euclid
def euclid2(x,y):
r = None
startTime = timeit.default_timer()
while 0 != r:
r = x-y
if(r > y):
r = r - y
if(r > y):
r = r - y
if(r > y):
r = x%y
x = y
y = r
times.append(timeit.default_timer() - startTime)
return x
#--------------------------------------------
#Main function for programming assignment 1.
def ProgAssign1(times):
count = 0
progAssign1WorkbookExtendedSetup()
randomNumbers = randomNumberPairs()
#Brute Force.
while count < 100:
sheet1.write(count+1,0,randomNumbers[(count*2)])
sheet1.write(count+1,1,randomNumbers[(count*2)+1])
sheet1.write(count+1, 2, bf(randomNumbers[(count*2)],randomNumbers[(count*2)+1]))
sheet1.write(count+1, 3, times[count])
count += 1
sheet2.write(1,1,max(times))
sheet2.write(2,2,min(times))
sheet2.write(3,3,(sum(times) / float(len(times))))
sheet2.write(4,4,statistics.median(times))
#-------------------------------------------------------
#Original Euclid's Algorithm main.
count = 0
del times[:]
while count < 100:
sheet3.write(count+1,0,randomNumbers[(count*2)])
sheet3.write(count+1,1,randomNumbers[(count*2)+1])
sheet3.write(count+1, 2, euclid1(randomNumbers[(count*2)],randomNumbers[(count*2)+1]))
sheet3.write(count+1, 3, (times[count]))
count += 1
sheet4.write(1,1,max(times))
sheet4.write(2,2,min(times))
sheet4.write(3,3,(sum(times) / float(len(times))))
sheet4.write(4,4,statistics.median(times))
#-------------------------------------------------------
#Enhanced Euclid's Algorithm
count = 0
del times[:]
while count < 100:
sheet5.write(count+1,0,randomNumbers[(count*2)])
sheet5.write(count+1,1,randomNumbers[(count*2)+1])
sheet5.write(count+1, 2, euclid2(randomNumbers[(count*2)],randomNumbers[(count*2)+1]))
sheet5.write(count+1, 3, times[count])
count += 1
sheet6.write(1,1,max(times))
sheet6.write(2,2,min(times))
sheet6.write(3,3,(sum(times) / float(len(times))))
sheet6.write(4,4,statistics.median(times))
#-------------------------------------------------------
while True:
print("Please choose a programming assignment.")
choice = input("1 for Programming Assignment 1. 0 to Exit.")
if choice == 1:
ProgAssign1(times)
wb.save('Brute_Force_Results.xls')
wb2.save('Brute_Force_Statistics.xls')
wb3.save("Original_Euclid_Results.xls")
wb4.save("Original_Euclid_Statistics.xls")
wb5.save("Second_Euclid_Results.xls")
wb6.save("Second_Euclid_Statistics.xls")
input("Data written to .xls files. Press Enter to continue.")
elif choice == 0:
sys.exit("Good bye.")
Я исправил все ошибки, которые возникали при отладке, но я столкнулся со стеной без ошибок, так какон обрабатывается, по-видимому, навсегда , как показано здесь. Он по-прежнему использует 15% моего процессора (но использование памяти не движется) , так что что-то происходит, и я уверен,Я каким-то образом испортил это, поэтому я ищу какой-то совет.
Сторона: Я сократил форматирование Excel, потому что я сомневаюсь, что именно в этом заключается проблема, но здесь она на всякий случайэто уместно:
#Excel Column and Row Titles
def progAssign1WorkbookExtendedSetup():
sheet1.write(0,0,"Number One")
sheet1.write(0,1,"Number Two")
sheet1.write(0,2,"Their GCD")
sheet1.write(0,3,"Time (Milliseconds)")
sheet2.write(0,0,"Statistics")
sheet2.write(0,1,"Milliseconds")
sheet2.write(1,0,"Max Time")
sheet2.write(2,0,"Min Time")
sheet2.write(3,0,"Avg Time")
sheet2.write(4,0,"Median Time")
#------------------------------
sheet3.write(0,0,"Number One")
sheet3.write(0,1,"Number Two")
sheet3.write(0,2,"Their GCD")
sheet3.write(0,3,"Time (Milliseconds)")
sheet4.write(0,0,"Statistics")
sheet4.write(0,1,"Milliseconds")
sheet4.write(1,0,"Max Time")
sheet4.write(2,0,"Min Time")
sheet4.write(3,0,"Avg Time")
sheet4.write(4,0,"Median Time")
#------------------------------
sheet5.write(0,0,"Number One")
sheet5.write(0,1,"Number Two")
sheet5.write(0,2,"Their GCD")
sheet5.write(0,3,"Time (Milliseconds)")
sheet6.write(0,0,"Statistics")
sheet6.write(0,1,"Milliseconds")
sheet6.write(1,0,"Max Time")
sheet6.write(2,0,"Min Time")
sheet6.write(3,0,"Avg Time")
sheet6.write(4,0,"Median Time")
return
#--------------------------------------------------------
Если вы видите множество несвязанных улучшений, которые я могу сделать, не стесняйтесь бросать их и мне.Я ищу для улучшения!Большое спасибо!