import math
import time
import sys
import random
import os
def isPrime(number):
if number % 2 != 0:
for i in range (3,math.floor(number**0.5)+1,2):
if number % i == 0:
return False
else:
if number != 2:
return False
return True
def makeListInts(lst):
for item in range(len(lst)):
try:
lst[item] = int(lst[item])
except:
try:
lst[item] = float(lst[item])
except:
pass
return lst
def getData():
with open('CurrentProgress.txt') as data:
return makeListInts([line[:-1].split(': ')[1] for line in data.readlines()])
def setData(data, ID):
titles = [
'Start: ' + str(data[1] + 1),
'End: ' + str(data[1] + data[2]),
'Step: ' + str(data[2]),
'Time: ' + str(time.time()),
'IDsRegistered: ' + ID]
with open('CurrentProgress.txt','w') as data:
for item in titles:
data.write(str(item)+'\n')
def checkFileProgress(data):
files = os.listdir('Calculated Primes/') #List all primes files
filesStripped = [int(i.split('-')[1][:-4]) for i in files] #Get the end numbers of each file
filesStripped.sort() # and sort
diffs = [filesStripped[i+1] - filesStripped[i] for i in range(len(filesStripped)-1)]
lastFileEnd = filesStripped[-1]
#print (diffs, sum(diffs) / len(diffs))
if max(diffs) != sum(diffs) / len(diffs): #If there is one that should not be there (max != avg)
indx = diffs.index(max(diffs))
print (indx)
data = [filesStripped[indx-1] + 1, filesStripped[indx-1] + data[2], data[2], data[3],data[4]] #Go back to there
setData(data,data[-1])
elif lastFileEnd + 1 != data[0]: # Otherwise, if the last file is before the recoreded end , go back there
data = [lastFileEnd - data[2] + 1, lastFileEnd, data[2], data[3], data[4]]
setData(data, data[-1])
def setMyID(currentIDs):
possibleIDs = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
if currentIDs == ' ':
return possibleIDs[0]
else:
try:
return possibleIDs[possibleIDs.index(currentIDs[-1]) + 1]
except IndexError:
return False
def removeMyID(data,ID):
ID = data[-1].replace(ID,'')
setData(data, ID)
print ()
def writePrimes(listOfPrimes, data):
direc = 'Calculated Primes/'
with open(direc + 'Primes' + str(data[0]) + '-' + str(data[1]) + '.txt','w') as primes:
for prime in listOfPrimes:
primes.write(str(prime) + '\n')
def checkTime(dataTime):
if dataTime + 1 > time.time():
sleepTime = round(random.random()+1,3) #01179107383 James
print ('Sleeping for ' + str(sleepTime) + ' to avoid collisions')
time.sleep(sleepTime);
return False
else:
return True
def makeBar(barWidth,data):
print ('Calculating primes between ' + str(data[0]) + ' and ' + str(data[1]) + ':')
sys.stdout.write("[%s]" % (" " * barWidth))
sys.stdout.flush()
sys.stdout.write("\b" * (barWidth+1)) # return to start of line, after '['
def updateBar():
sys.stdout.write("==")
sys.stdout.flush()
def closeBar():
sys.stdout.write("\n")
def main(ID):
data = getData()
if checkTime(data[3]):
barWidth = 40
if ID in data[-1]:
ID = data[-1]
else:
ID = data[-1] + ID
setData(data,ID)
makeBar(barWidth, data)
listOfPrimes = []
for number in range(data[0],data[1]):
result = isPrime(number)
if (number - 1) % round(data[2] / (barWidth / 2)) == 0:
updateBar()
if result:
listOfPrimes += [number]
writePrimes(listOfPrimes, data)
closeBar()
else:
main(ID)
def setup():
data = getData()
if data[-1] == ' ':
checkFileProgress(data)
if checkTime(data[3]):
ID = setMyID(data[-1])
print (ID)
if ID:
try:
while True:
main(ID)
except KeyboardInterrupt:
data = getData()
removeMyID(data,ID)
quit('Saving and Exiting')
else:
quit('Already 12 programs running')
else:
setup()
setup()
下面是它访问的文件(CurrentProgress.txt
):
Start: 381000001
End: 382000000
Step: 1000000
Time: 1468445801.017807
IDsRegistered:
文件的最后一行有两个尾随空格。
它有一个ID函数,允许来自A的任何ID。如果已经有12,则阻止脚本运行。每个脚本都等待一个随机的时间来避免与其他脚本的冲突(无论如何,这是不可能的)。当脚本终止时,ID将被移除。因为文件是在计算完成之前更新的,所以当运行第一个脚本时,它会将文件设置为下一个块(通过检查文件)。这只发生在第一个脚本(即接受ID A
的脚本)。同样,它检查块是否被跳过(如果脚本以错误的顺序终止)并跳回那里。
我意识到这段代码相当长(150行),所以如果你想选择一个函数来复习,它仍然会帮助我学习!
发布于 2016-07-13 22:51:54
我将从几个项目和一个函数开始。
writePrimes(listOfPrimes, data):
而不是write_primes(prime_list, filename_list)
对于我选择的函数setData
def setData(data, ID):
titles = [
'Start: ' + str(data[1] + 1),
'End: ' + str(data[1] + data[2]),
'Step: ' + str(data[2]),
'Time: ' + str(time.time()),
'IDsRegistered: ' + ID]
with open('CurrentProgress.txt','w') as data:
for item in titles:
data.write(str(item)+'\n')
应分成两部分:
def get_titles(data, id):
return [
'Start: {0}'.format(data[1] + 1),
'End: {0}'.format(data[1] + data[2]),
'Step: {0}'.format(data[2]),
'Time: {0}'.format(time.time()),
'IDsRegistered: ' + id]
def write_file(data, id):
"""Writes a file full of prime numbers
data is a list consisting of a start and a step value,
id is the name of the file registered"""
with open('CurrentProgress.txt','w') as out_file:
for item in get_titles(data, id):
out_file.write(str(item)+'\n')
总之,我认为如果您始终在代码中使用更多的描述性名称,如果参数或方法名称不明确,则会更容易地查看哪些函数可以模块化,并给您提供更好的代码回顾。
编辑:还有一个功能
def checkFileProgress(data):
files = os.listdir('Calculated Primes/') #List all primes files
filesStripped = [int(i.split('-')[1][:-4]) for i in files] #Get the end numbers of each file
filesStripped.sort() # and sort
diffs = [filesStripped[i+1] - filesStripped[i] for i in range(len(filesStripped)-1)]
lastFileEnd = filesStripped[-1]
#print (diffs, sum(diffs) / len(diffs))
if max(diffs) != sum(diffs) / len(diffs): #If there is one that should not be there (max != avg)
indx = diffs.index(max(diffs))
print (indx)
data = [filesStripped[indx-1] + 1, filesStripped[indx-1] + data[2], data[2], data[3],data[4]] #Go back to there
setData(data,data[-1])
elif lastFileEnd + 1 != data[0]: # Otherwise, if the last file is before the recoreded end , go back there
data = [lastFileEnd - data[2] + 1, lastFileEnd, data[2], data[3], data[4]]
setData(data, data[-1])
遵循上述同样的指导方针,可以这样写:
def get_last_number(file):
return int(file.split('-')[1][:-4])
def get_sorted_file_numbers(files):
files_stripped = [get_last_number(i) for file in files] # get the last number of each file
files_stripped.sort() # and sort
return files_stripped
def get_diffs(file_numbers)
return [file_numbers[i+1] - file_numbers[i] for i in range(len(file_numbers)-1)]
def get_file_data(diffs, file_numbers):
last_file_number = file_numbers[-1]
if max(diffs) != sum(diffs) / len(diffs): #If there is one that should not be there (max != avg)
indx = diffs.index(max(diffs))
print (indx)
data = [file_numbers[indx-1] + 1,
file_numbers[indx-1] + file_numbers[2],
file_numbers[2],
file_numbers[3],
file_numbers[4]] #Go back to there
return data
elif last_file_number = file_numbers[-1] + 1 != file_numbers[0]: # Otherwise, if the last file is before the recoreded end , go back there
data = [last_file_number - file_numbers[2] + 1,
last_file_number,
file_numbers[2],
file_numbers[3],
file_numbers[4]]
return data
def checkFileProgress(data):
files = os.listdir('Calculated Primes/') #List all primes files
file_numbers = get_sorted_file_numbers(files)
diffs = get_diffs(file_numbers)
prime_data = get_file_data(diffs, file_numbers)
write_file(prime_data, prime_data[-1])
使您的代码模块化允许它是一个接一个的可测试性。然后,您只需使用一个小的差异和file_numbers列表来测试file_numbers。以确保您获得的数据是正确的。
https://codereview.stackexchange.com/questions/134809
复制相似问题