Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import operator
- def main():
- t0 = time.time()
- vlans, requests = load_files()
- total = len(requests)
- with_redundancy = sum(e[1] for e in requests)
- no_redundancy = total - with_redundancy
- output_rows = no_redundancy + with_redundancy * 2
- out = [None] * output_rows
- no_red_start = 0
- with_red_start = 0
- idx = 0
- t1 = time.time()
- by_vlan_id = sorted(vlans, key=operator.itemgetter(2,0))
- for reqn, red in requests:
- if red:
- dev_id, vlan_id, with_red_start = next_with_redundancy(by_vlan_id, with_red_start)
- out[idx] = [reqn, dev_id, 0, vlan_id]
- out[idx+1] = [reqn, dev_id, 1, vlan_id]
- idx += 2
- else:
- dev_id, vlan_id, no_red_start = next_no_redundancy(by_vlan_id, no_red_start)
- out[idx] = [reqn, dev_id, 1, vlan_id]
- idx += 1
- t2 = time.time()
- with open("output_py.csv", 'w') as f:
- f.write('request_id,device_id,primary_port,vlan_id\n')
- for line in out:
- f.write("%d,%d,%d,%d\n" % tuple(line))
- t3 = time.time()
- print("total %.2fsec: reading: %dms, processing: %dms, writing: %dms" % (
- t3 - t0, (t1 - t0) * 1000, (t2 - t1) * 1000, (t3 - t2) * 1000))
- def next_no_redundancy(vlan_info, start):
- while True:
- info = vlan_info[start]
- start += 1
- if not info[2]:
- continue
- if info[1]:
- dev_id = info[0]
- vlan_id = info[2]
- info[2] = 0
- return dev_id, vlan_id, start
- def next_with_redundancy(vlan_info, start):
- dev_id, vlan_id, primary, secondary = None, None, None, None
- while True:
- info = vlan_info[start]
- start += 1
- if not info[2]:
- continue
- if dev_id is None or info[0] != dev_id or info[2] != vlan_id:
- dev_id = info[0]
- vlan_id = info[2]
- primary, secondary = None, None
- if info[1]:
- primary = start-1
- else:
- secondary = start-1
- if primary is not None and secondary is not None:
- vlan_info[primary][2] = 0
- vlan_info[secondary][2] = 0
- return dev_id, vlan_id, start
- def load_files():
- vlans = []
- requests = []
- with open('vlans.csv') as f:
- f.readline()
- for line in f.readlines():
- vlans.append([int(e) for e in line.split(",")])
- with open('requests.csv') as f:
- f.readline()
- for line in f.readlines():
- requests.append([int(e) for e in line.split(",")])
- return vlans, requests
- if __name__ == "__main__":
- m
Advertisement
Add Comment
Please, Sign In to add comment