I have the following code stored in a .py file:
input1 = ["2",
"0 0 1 1 small",
"3 2 6 5 large",
"3",
"2 0 small",
"0.5 0.6 medium",
"3 4 large",
"3",
"60.0 2.9 111.4 32.9 medium",
"20.0 82.6 43.4 153.1 small",
"34.7 9.6 56.6 78.2 large",
"6",
"60.0 8.3 small",
"43.4 153.1 small",
"13.4 55.9 medium",
"61.5 68.1 medium",
"72.1 69.1 large",
"78.4 13.2 large",
"0"]
nm = []
peanut_descriptions = []
box_descriptions = []
for line in input1:
next_line_index = input1.index(line)+1
parsed_line = line.split()
# number of box/peanut descriptions for each case
if len(parsed_line) == 1:
if int(parsed_line[0]) == 0:
break
parsed_next_line = input1[next_line_index].split()
nm.append(int(parsed_line[0]))
# identify peanut descriptions
if len(parsed_line) == 3:
peanut_description_dict = {'x': parsed_line[0],
'y': parsed_line[1],
'peanut_size': parsed_line[2]}
peanut_descriptions.append(peanut_description_dict)
# identify box descriptions
if len(parsed_line) == 5:
box_description_dict = {'x1': parsed_line[0],
'y1': parsed_line[1],
'x2': parsed_line[2],
'y2': parsed_line[3],
'intended_size': parsed_line[4]}
box_descriptions.append(box_description_dict)
previous_line = line
# peanut sizes
peanut_sizes = []
for i in peanut_descriptions:
peanut_size = i['peanut_size']
peanut_sizes.append(peanut_size)
# cases
cases = []
for i in range(len(nm)):
if i % 2 != 0:
continue
boxes_index = nm[i]
peanuts_index = nm[i+1]
boxes_case = box_descriptions[0:boxes_index]
peanuts_case = peanut_descriptions[0:peanuts_index]
case = [boxes_case, peanuts_case]
cases.append(case)
del box_descriptions[0:boxes_index]
del peanut_descriptions[0:peanuts_index]
# matching
matched_boxes = []
matched_peanuts = []
statuses = []
all_statuses = []
for case_index in range(len(cases)):
case = cases[case_index]
box = case[0]
peanut = case[1]
statuses = []
for p in range(len(peanut)):
status = "floor"
for b in range(len(box)):
p_x = float(peanut[p]['x'])
p_y = float(peanut[p]['y'])
peanut_size = peanut[p]['peanut_size']
b_x1 = float(box[b]['x1'])
b_y1 = float(box[b]['y1'])
b_x2 = float(box[b]['x2'])
b_y2 = float(box[b]['y2'])
box_category = box[b]['intended_size']
values1 = (p_x, p_y, peanut_size, b_x1, b_y1, b_x2, b_y2, box_category)
if b_x1 <= p_x <= b_x2 and b_y1 <= p_y <= b_y2:
final_box = box[b]["intended_size"]
status = final_box
# print(values1)
if peanut_size == box_category and status == box[b]["intended_size"]:
status = "correct"
# values1 = {"p_x": p_x, "p_y": p_y, "b_x1": b_x1, "b_y1": b_y1, "b_x2": b_x2, "b_y2": b_y2}
# print(values1)
statuses.append(status)
all_statuses.append(statuses)
matched_boxes = []
matched_peanuts = []
# # final answer:
output1 = []
statuses1 = []
for i in range(len(all_statuses)):
case_statuses = all_statuses[i]
paragraph = ""
for j in range(len(case_statuses)):
line = peanut_sizes[j] + " " + case_statuses[j] + "n"
paragraph += line
output1.append(paragraph)
del peanut_sizes[0:len(case_statuses)]
statuses1.append(case_statuses)
case_statuses = []
output1 = "n".join(output1)
print(output1)
This code executes perfectly fine. But now I want to measure the time it takes to execute the code. So I try to insert it into timeit.timeit in the following way:
import timeit
test1 = """
# copy+paste the above code here
"""
print(timeit.timeit(test1, number=100))
And now I get the following error:
line = peanut_sizes[j] + " " + case_statuses[j] + "
^
SyntaxError: EOL while scanning string literal
So apparently, it seems like the python code is giving me EOL error because I put n
before the final quote. But in the problem I’m trying to solve, I really need to have multiple lines (including blank lines) in a specific pattern, as part of the final output, and it needs to create those blank lines automatically for a large variety of multi-line inputs.
The input1
is a modified version of the actual input just so I can see more clearly what’s going on while coding. The actual input will be the same as input1, except that it’s a file object rather than a list, and there will be a new line instead of the commas. My code will convert that file object into the input1
list that you see in the code.
So how do I timeit.timeit the multi-line output from above code without EOL error?
Advertisement
Answer
you can call a function with timeit
def a_function(some_inputs):
outputs1 = do_some_crazy_stuff(some_inputs)
outputs2 = do_some_more_crazy_stuff(outputs1)
return some_really_crazy_stuff(outputs2)
timeit.timeit(lambda: a_function(my_input_test), number=10)
however your actual problem is just malformed code … it opens a string and never closes it
you need to escape"n"
to "\n"
, otherwise your n
gets evaluated literally to
my_var = asd + " " + dsa + "
"
which is a syntax error of unterminated string literal