import timeit

response_content = {u'retrievePolicyBillingSummariesResponse': {u'billingSummaries': {u'policyBillingSummary': [{u'policy': {u'status': u'A', u'policyNumber': u'xyz123', u'writingCompany': u'FBI', u'renewalFlag': u'false', u'convertedRenewalOffer': u'false', u'termExpirationDate': u'2017-06-26', u'lineOfBusiness': u'PC', u'termEffectiveDate': u'2016-06-26', u'riskState': u'CA', u'insureds': {u'namedInsuredSummary': [{u'preferredPostalAddress': {u'streetAddressLine': u'1 disney', u'cityName': u'palo alto', u'zipCode': u'94100', u'isoRegionCode': u'CA'}, u'name': {u'lastName': u'DOE', u'fullName': u'john doe', u'firstName': u'john'}}]}, u'additionalInterests': {u'additionalInterest': [{u'billTo': u'N', u'name': {u'partyType': u'Organization'}}]}, u'type': u'PA', u'statusDescription': u'Active', u'dataSource': u'from_heaven'}, u'billingSummary': {u'paymentRestriction': u'false', u'nextInstallmentAmount': u'0.00', u'bill': {u'installmentNumber': u'1', u'statementDate': u'2016-06-26', u'paymentPlan': u'Direct', u'installmentAmount': u'12.00', u'totalBillAmountDue': u'1.76', u'previousBalance': u'0.00', u'dueDate': u'2016-06-26', u'billingPlan': u'ANN'}, u'lastPayment': {u'status': u'A'}, u'currentBalance': u'16.66', u'payOffAmount': u'15.66', u'isRestrictedToPay': u'false'}}]}}}

my_path = [
    "retrievePolicyBillingSummariesResponse",
    "billingSummaries",
    "policyBillingSummary",
    0,
    "billingSummary",
    "lastPayment",
    "status"
]

def tne_get_value_from_content(extraction, my_path):
    for el in my_path:
        if isinstance(extraction, dict):
            extraction = extraction.get(el, extraction)
        else:
            extraction = extraction[el]
    return extraction
tne_perf = timeit.timeit('tne_get_value_from_content(response_content, my_path)',
                         setup='from __main__ import tne_get_value_from_content, response_content, my_path')


def abc_get_value_from_content(response_content, my_path):
     if my_path:
         return abc_get_value_from_content(response_content[my_path[0]], my_path[1:])
     return response_content
abc_perf = timeit.timeit('abc_get_value_from_content(response_content, my_path)',
                         setup='from __main__ import abc_get_value_from_content, response_content, my_path')



def mgi_get_value_from_content(response_content, my_path):
    if len(my_path) > 1:
        return mgi_get_value_from_content(response_content[my_path[0]], my_path[1:])
    else:
        return response_content[my_path[0]]
mgi_perf = timeit.timeit('mgi_get_value_from_content(response_content, my_path)',
                         setup='from __main__ import mgi_get_value_from_content, response_content, my_path')

print('mgig   :{perf}| {comp}% slower'.format(perf=mgi_perf, comp=100*(-1+mgi_perf/tne_perf)))
print('abccd  :{perf}| {comp}% slower'.format(perf=abc_perf, comp=100*(-1+abc_perf/tne_perf)))
print('tnerual:{perf}'.format(perf=tne_perf))
